如何爬取知乎的ajax內容?
正在學習爬蟲,想爬取我關注的全部人,並分別爬取他們的收藏。但是我用python爬取的時候,只能獲取20個我關注的人,剩餘的是ajax生成的數據,就無法爬取。請問有什麼方法能在python中一個顯示我的全部關注的人?謝謝解答
直接回答:
https://www.zhihu.com/node/ProfileFolloweesListV2
詳細回答:
如 @TweLveAndOne 所說的那樣,你可以用 Chrome 瀏覽器的開發者工具看到所有的請求,其中就包括 Ajax 的目標鏈接及其請求報文。
比如查看題主所關注的人,先打開這個頁面:https://www.zhihu.com/people/feng-xiong-53-25/followees。
然後打開 Chrome 的開發者工具窗口,監控 Network(具體使用方法自己學習一下)。
下拉頁面,直到觸發 ajax 請求獲取下一頁的用戶列表(頁面上顯示為載入中),就能在開發者工具欄看到具體的請求鏈接(即 https://www.zhihu.com/node/ProfileFolloweesListV2),及相應的 request 和 response.
如果用 Python 抓取知乎數據,可以參考這兩個項目:- zhihu-python: https://github.com/egrcc/zhihu-python
- zhihu-py3: https://github.com/7sDream/zhihu-py3
====================下面是廣告時間,如無興趣可以跳過。====================
如果對 Go 有興趣,也可以看我前段時間寫的一個庫,也參考學習了前面提到的兩個 Python 庫:- zhihu-go: https://github.com/DeanThompson/zhihu-go
咦,我好像答錯了_(:△」∠)_
弄成了載入首頁的數據。。。。
--------------------------
用chrome看network的XHR數據
你可以找到那個返回json數據的請求
看下post的參數
然後設置好參數就行啦
def get_pages():
headers["Content-Type"] = "application/x-www-form-urlencoded"
headers["X-Xsrftoken"] = get_xsrf()
for x in range(1, 10):
json_url = "https://www.zhihu.com/node/TopStory2FeedList"
offfset = 10*x
payload = "params=%7B%22offset%22%3A{0}%2C%22start%22%3A%22{1}%22%7Dmethod=next".format(offfset, offfset-1)
r = session.post(json_url, headers = headers, data = payload)
get_titles(r, True)
def get_titles(r, json):
if not json:
bs = BeautifulSoup(r.text, "html5lib")
titles = bs.findAll("h2", {"class", "feed-title"})
print(titles)
else:
for x in r.json()["msg"]:
bs = BeautifulSoup(x, "html5lib")
titles = bs.findAll("h2", {"class", "feed-title"})
print(titles)
你可以抓包拿到ajax的目標鏈接
還有必要的欄位 還有提交方式Python 我不知道 不過都差不多Ajax其實和抓取普通鏈接是一樣的抓包你可以直接用chrome
或者軟體fiddler這裡是用php 寫的 你可以參照一下
沒什麼難度的 拿到登錄的cookie
請求地址時帶上post的值
就能拿到
offset 代表開始的值 就是從第幾個開始拿數據這裡是直接輸出來
頭像沒拿到是 沒設置來源的地址吧以上研究了下,已經實現了,感謝各位熱心的回答呢,
之前在工作中也遇到了需要抓取ajax內容,網頁調用的介面需要動態生成的cookies,反覆嘗試之後找到一個可行的方法:利用selenium + browsermob-proxy + chrome實現類似chrome開發者工具network的功能,監聽網路來得到對應的數據。具體見
抓取動態載入頁面的一種方法 - 知乎專欄
我真的是想跪了,按照上面各位的方法,都試了一遍,但還是不行;還是報錯 DEBUG: Crawled (400) &
@莫小平
def parse_info(self, response):
headers = {
"Accept":"*/*",
"Accept-Encoding":"gzip, deflate, br",
"Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Connection":"keep-alive",
"Content-Length":"93",
"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0",
"Referer":"https://www.zhihu.com/question/20899988",
"X-Requested-With":"XMLHttpRequest",
"X-Xsrftoken":response.meta["_xsrf"]
}
url = "https://www.zhihu.com/node/QuestionAnswerListV2"
yield scrapy.FormRequest(
url=url,
headers=headers,
formdata={
"method":"next",
"params":"{"url_token":20899988, "pagesize":10, "offset":10}"
},
meta={"cookiejar": response.meta["cookiejar"]},
callback=self.parse
)
推薦閱讀:
※使用 Python 寫一個搶課用的軟體,卡在了取課表這一步,怎麼辦?
※Python3.4 用 pip 安裝lxml時出現 「Unable to find vcvarsall.bat 」?
※基於python的scrapy爬蟲,關於增量爬取是怎麼處理的?
※GitHub 上有什麼值得學習,簡單的,易讀的 Python 項目?
※python開發一個項目要怎麼做?