【python爬虫】 python 爬取知乎的公开收藏夹

前言

看看如何用 python 爬取知乎的公开收藏夹

内容

尝试

  1. 第一个方法
    开始的时候用 python ,request 库进行的网页请求,在请求你的收藏夹总界面的时候还可以返回信息,这个 url,https://www.zhihu.com/people/xxx/collections,,xxx 部分可以查看自己知乎账号那儿是长怎么样的。再进入了具体的收藏夹页面的时候https://www.zhihu.com/collection/3341994xx request 就返回不了内容。这应该是因为知乎这个页面是 js 动态加载的 (需要 js 逆向),request 这个链接返回不了,你要的内容。。
  2. 第二个方法
    用 selenium 模拟浏览器进行爬虫,selenium 是 python 一个用来控制浏览器的库 (pip 下载),可以用来做关于浏览器的自动化,也可以用来爬虫。它需要搭配浏览器的驱动进行使用。火狐,chrome,edge 都有自己的驱动。火狐驱动地址谷歌驱动地址edge驱动地址

selenium

登录知乎

下好库和驱动后,开始写一下,发现在用 selenium 操作浏览器打开知乎,输入密码登录时会出现 10001 错误,一个博客上写是因为 js 判断识别出来这是机器在操作,网上有一些解决方法,这里选取了用浏览器 debug 模式,新建了一个用户文件夹,每次打开浏览器直接控制这个新的浏览器。

  1. 如何新建浏览器用户文件
  2. 找到浏览器 exe 文件目录,在这里进入 cmd 命令行模式。
  3. 输入以下代码 chrome.exe --remote-debugging-port=9222 --user-data-dir="E:\data_info\selenium_data 。chrome. exe 就是对于浏览器的 exe 文件 (edge 就是 msedge. exe) , 9222 自己选一个端口号等下在代码中要写一下,最后那个是生成的新的用户目录自己写一个。
  4. 对浏览器创建一个新的快捷方式放到桌面,然后右键属性,在目标这一栏填上 2 中的代码,点击就会打开一个新的浏览器,然后在这里先登录好知乎。

具体代码

from requests import options
from selenium import webdriver  # 用来驱动浏览器的
import time
import selenium
from selenium.webdriver.edge.options import Options
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
import os
os.startfile("C:\\Users\\Administrator\\Desktop\\Microsoft Edge (1).lnk") # 打开设置好的浏览器快捷方式
options = Options() # 得到edge的设置
options.add_experimental_option("debuggerAddress", "127.0.0.1:6001") # 配置浏览器的端口地址
#options.add_experimental_option('excudeSwitches',['enable-automation'])
driver=webdriver.Edge(service =Service("D:\\BaiduNetdiskWorkspace\\Lite Code\\python脚本\\firefox_selenium\\msedgedriver.exe"),options=options) # 浏览器驱动的放置地址
time.sleep(3)
write = ""

def get_all_folder(url):
    driver.get(url)
    time.sleep(2)
    href=[]
    title = driver.find_elements(By.XPATH,'(//a[@class="SelfCollectionItem-title"])')
    for ind,i in enumerate(title):
        href.append(title[ind].get_attribute('href'))
    return href

def pythonpazhihu(url,write):
    driver.get(url)
    time.sleep(3)
    #h2 = driver.find_elements(By.CLASS_NAME,"ContentItem-title")
    title = driver.find_elements(By.XPATH,'(//h2[@class="ContentItem-title"]//a)')
    h3 = driver.find_elements(By.XPATH,'(//h2[@class="ContentItem-title"]//a[@href])')
    for ind,i in enumerate(h3):
        content = str(title[ind].text)+" , "+str(h3[ind].get_attribute('href'))
        write=write+content+"\n"
        print(title[ind].text,h3[ind].get_attribute('href'))
    #print(h3.text)
    time.sleep(2)
    return write
try:    
    url_all1 = "https://www.zhihu.com/collections/mine?page=1" # 总收藏也有两页,得到这两页每个收藏夹的具体链接
    url_all2 = "https://www.zhihu.com/collections/mine?page=2"
    href1 = get_all_folder(url_all1)
    href2 = get_all_folder(url_all2)
    href2 = href1+href2
    #print(href2)
    for url_son in href2:
        for i in range(5):
            #url = 'https://www.zhihu.com/collection/7179314xx?page=%s'%(i+1)
            url = url_son+'?page=%s'%(i+1) # 对每个收藏夹链接进行5页的循环
            write = pythonpazhihu(url,write) # 把读到的标题和链接写到write变量中
finally:
    driver.close()
    with open("./zhihu.txt","w",encoding="utf-8") as fp:
        fp.write(write)

小结

  1. 代码思路就是,先打开浏览器快捷方式,访问总的收藏夹页面,得到每个的收藏夹链接,再访问每个具体链接获取收藏的标题和地址。
  2. 注意的,1. 浏览器驱动地址填写用的 service 的方式,这是 selenium 更新后新的写法。2. selenium 新的定位变成了 find_elements 有两个参数,By. xxx ,用来表示用什么方式定位,例如 By. xpath, 注意 xpath 内容要用 () 括起来。

Original: https://www.cnblogs.com/shucode/p/16760214.html
Author: 师怀
Title: 【python爬虫】 python 爬取知乎的公开收藏夹

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/808895/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球