工科男一枚,不会花言巧语的累述。直奔主题吧!
本文介绍python爬取四大网站(百度/360/新浪/搜狗)的热搜词,先以百度为例介绍。
爬取步骤:
第一步 引入使用的库。小编使用的爬虫库是bs4+正则,HTTP请求方法为requests,代码如下
import requests from bs4 import BeautifulSoup import re
第二步 获取热搜词html并解析出来,百度热搜词URL http://top.baidu.com/buzz?b=1&fr=topindex , 代码如下
url = "http://top.baidu.com/buzz?b=1&fr=topindex" r = requests.get(url,headers=header) html = r.text.encode('iso-8859-1').decode('gbk') #中文乱码处理,非常重要 print (html) s = BeautifulSoup(html,"lxml")
第三步 获取热搜词所在html中的标签 ,标签越特殊越唯一越好,容易定位,这里选取了 tr 标签,因为热搜词和热度在这个标签里可以拿到:
代码:
hotwords = s.find_all("tr") #oneline
第四步 由于步骤三得到的结果到是一个list,这里使用for循环取出list的每个元素,并使用正则取出对应的热搜词、热度,并以字典列表形式返回,代码如下:
i = 0 resDictList = [] for hotword in hotwords: #正则取 hotword = str(hotword) #正则必须是string patternQuery = re.compile(r'''target="_blank">(.*?)</a>''') query = re.findall(patternQuery,hotword) patternHeat = re.compile(r'''">(.*?)</span>''') heat = re.findall(patternHeat,hotword) if len(query)>0 and len(heat)>0: #有返回空的情况,过滤掉 jumpHref = "https://www.baidu.com/baidu?wd=" + str(query[0]) resDict = {"num":str(i+1),"query":query[0],"heat":heat[-1],"jumpHref":jumpHref} resDictList.append(resDict) i = i + 1
第五步 为防止IP被封,使用浏览器请求的header伪装请求头信息:
大功告成,看下效果吧!
演示:http://www.renyyy.com/hotwords/(已处理为html形式)。
结果会以字典List形式返回:
[{"num":1,"query":热搜词1,"heat":999,"jumpHref":" {"num":2,"query":热搜词2,"heat":888,"jumpHref":"http://123.html?k=222"},]
篇幅过长,360/新浪/搜狗的不再分步骤介绍,如需完整代码,关注公众号,回复关键词:热搜词