我們隨便找了一篇文章來進(jìn)行實(shí)戰(zhàn)操作地址如下
https://www.toutiao.com/a6608208517834736142/
用chrome看了一下源碼哼蛆,沒有發(fā)現(xiàn)期望中的html結(jié)構(gòu)曹鸠,還是通過接口動(dòng)態(tài)加載算行,不過在查看源碼的時(shí)候發(fā)現(xiàn)來一些有趣的東西就是在script腳本里面發(fā)現(xiàn)來articleInfo這個(gè)東西,里面的數(shù)據(jù)就是文章詳情頁的數(shù)據(jù)甘畅,乍一看還看不出來,html標(biāo)簽都被轉(zhuǎn)義了,所以要仔細(xì)的看看京革,既然這里能夠發(fā)現(xiàn)我們想要的東西,那么接下來的就是抄家伙開擼幸斥,思路是通過urllib請(qǐng)求拿到真?zhèn)€的返回內(nèi)容然后通過正則表達(dá)式進(jìn)行提取匹摇,提取完以后在用html庫進(jìn)行進(jìn)行轉(zhuǎn)義就可以拿到內(nèi)容了,是不是很666
直接上代碼甲葬。代碼中有些是專有的業(yè)務(wù)邏輯剔除掉即可
def get_article_detail(self, item):
url = 'https://www.toutiao.com/i' + item.item_id
is_exist = self.r.sismember(u'url', url)
# 如何redis中已經(jīng)存在爬過的url則自動(dòng)跳過
if not is_exist and item.article_genre == 'article':
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'Connection': 'keep-alive',
'authority': 'www.toutiao.com',
'referer': 'https://www.toutiao.com/i' + item.item_id + '/',
'method': 'GET',
'path': 'a/' + item.item_id + '/',
'scheme': 'https'
}
self.s.headers.update(headers)
req = self.s.get(url, proxies=get_proxy_ip())
#隨機(jī)休眠幾秒
time.sleep(random.random() * 2 + 3)
resp_data = req.text
data = resp_data.decode()
content = re.findall(r"content:(.+)", data)[0]
content = html.unescape(content)
content = re.findall("'(.+)'", content)[0]
item.content = content
#更新文章內(nèi)容
toutiaodb.update(item)
self.r.sadd(u'url', url)
return item