我们随便找了一篇文章来进行实战操作地址如下
https://www.toutiao.com/a6608208517834736142/
用chrome看了一下源码,没有发现期望中的html结构,还是通过接口动态加载,不过在查看源码的时候发现来一些有趣的东西就是在script脚本里面发现来articleInfo这个东西,里面的数据就是文章详情页的数据,乍一看还看不出来,html标签都被转义了,所以要仔细的看看,既然这里能够发现我们想要的东西,那么接下来的就是抄家伙开撸,思路是通过urllib请求拿到真个的返回内容然后通过正则表达式进行提取,提取完以后在用html库进行进行转义就可以拿到内容了,是不是很666
直接上代码。代码中有些是专有的业务逻辑剔除掉即可
def get_article_detail(self, item):
url = 'https://www.toutiao.com/i' + item.item_id
is_exist = self.r.sismember(u'url', url)
# 如何redis中已经存在爬过的url则自动跳过
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())
#随机休眠几秒
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
#更新文章内容
toutiaodb.update(item)
self.r.sadd(u'url', url)
return item