_

[Python] BS4+正则爬取百度/360/新浪/搜狗四大网站热搜词

 

时间:2019-04-23 来源:人云亦云


 

工科男一枚,不会花言巧语的累述。直奔主题吧!

本文介绍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/新浪/搜狗的不再分步骤介绍,如需完整代码,关注公众号,回复关键词:热搜词


赞助打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开微信扫一扫,即可进行扫码打赏哦

您的支持,鼓励我们做得更好!

「人云亦云」


标签: 涨知识 | 如有转载,请注明出处 |
本文链接:
http://blog.hellotom.top/articles/941/


亲,看完记得留下足迹哦


更多有料好玩的内容 尽在人云亦云公众号
360网站安全检测平台