事情的起因
前一陣突然收到了這樣一封私信
python能在生活中做什么?
假約稿,真廣告
來簡書也有一段時間了,這種私信收到了不少,基本都是打著約稿的旗號來騙關注的。其實我覺得主動要求別人的關注沒有問題,但是應該明目張膽、大張旗鼓的才對,哪能這樣鬼鬼祟祟,企圖瞞天過海?看了看這個作者,居然還是個專題編輯呢。
python爬蟲教程、
image.png
所以我就試探的問問她,既然想約稿,那么到底有沒有看過我的文章。
python怎么用、
image.png
那么現在問題來了,我在簡書上也有將近1500個贊了,其中到底有沒有這位同志的贊呢?自己手動去看看?這可不是程序員的答案!我們的答案是爬蟲!
獲取用戶timeline
可以很容易的看出,https://www.jianshu.com/users/5aa8494a18c8/timeline 這樣的url就是用戶的timeline,但是頁面默認只展示一部分,更早的timeline是瀏覽器下拉后獲取的。用瀏覽器的開發者工具可以看到請求信息。
動態加載的timeline
page這個參數顯而易見,那么max_id是怎么來的呢?首先要看看這些請求是哪里發出來的。
查看請求調用關系
這個看著信息量好大
這個函數看著最像
再看看s函數,終于找到了max_id的獲取方式
max_id
max_id可以根據最后一個li元素的id屬性獲得。
利用requests庫進行爬取
requests庫就不多介紹了,這里注意兩點:
要手動設置請求的header,來模擬正常瀏覽器
ajax請求要設置額外的header,來模擬下拉刷新
對每次請求下載的response,使用lxml解析,然后利用xpath獲取最后一個li元素,進而計算max_id。再用計算出的max_id發起新的請求。
當返回的文本中包含"加入了簡書”則停止爬取。
爬取結果分析
爬取了該用戶的所有動態,存儲到了一個文本文件中,在其中搜索"大神帶我來搬磚”,未找到任何結果。所以該用戶根本沒給我點贊過。
image.png
當然,后來我又學會了用selenium來完成同樣的工作。
源碼
import requests
from lxml import etree
my_header = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
res = requests.get(url='https://www.jianshu.com/users/5aa8494a18c8/timeline', headers={'user-agent': my_header})
if '大神帶我來搬磚' in res.text:
print('found')
page = etree.HTML(res.text)
last_li = page.xpath('''//ul[@class="note-list"]/li[last()]''')[0]
max_id = int(last_li.get('id').split('-')[1]) - 1
file = open("activity.txt",'w',encoding='utf-8')
page = 2
while True:
res = requests.get(url='https://www.jianshu.com/users/5aa8494a18c8/timeline?max_id=%s&page=%s' %(max_id,page),
headers={'user-agent': my_header, 'X-INFINITESCROLL':'true'})
last_li = etree.HTML(res.text).xpath('''/html/body/li[last()]''')[0]
max_id = int(last_li.get('id').split('-')[1]) - 1
page = page + 1
file.write(res.text)
file.write(" ")
if '加入了簡書' in res.text:
print('end')
break
file.close()
原文作者:大神帶我來搬磚
愛好歷史和武俠,專注java、大數據的程序員小哥哥。
學習資料共享,技術問題討論,希望和大家一起交流進步。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态