前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【python】利用requests爬取百度贴吧用户信息

【python】利用requests爬取百度贴吧用户信息

作者头像
会呼吸的Coder
发布2020-02-17 17:40:02
1.9K0
发布2020-02-17 17:40:02
举报
文章被收录于专栏:会呼吸的Coder

今天突然奇想,想去爬一下贴吧试试,而躺枪的当然是python吧

本次爬取利用了requests包去请求,bs4去解析页面,同时用了云mongodb,利用pymongdb去链接

接下来就讲解一下怎么去爬取贴吧的

1.安装需要的工具包:

requests包,这个主要是用来发送get或者post请求,获取请求结果

pip install requests

beautifulSoup包,这个主要是用来解析得到的html页面的,方便简单,但是这个包效率低

除了这个包,还可以去尝试用xpath,css选择器,甚至正则去解析,只要你喜欢,用什么解析都可以,本次使用beautifulSoup包

pip install bs4

pymongo,这个python操作mongodb的工具包,在爬虫中,因为爬下来的数据有一部分是脏数据,所以比较适合使用非关系型数据库存储,mongodb就是一个非关系数据库

pip install pymongo

因为我使用的是一款云数据库所以需要安装一下dnspython,如果不是用mongodb官网提供的云数据库,不需要安装这个

pip install dnspython

2.分析页面

首先进入python吧

此时页面链接是http://tieba.baidu.com/f?ie=utf-8&kw=python&fr=search&red_tag=s3038027151

我们点击下一页,多点击几次,然后上一页,回到首页

发现链接http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=0,http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=0

在多个链接中,我们发现规律kw是搜索的关键字,pn是分页,第一页是0,第二页是50,第三页是100,此时我们根据这种规律拼接出来url链接,放到postman中请求,发现规律是对的。这样我们就可以发送请求去抓取列表页了。

现在我们抓取到列表页了,那么怎么获取用户信息呢。

这时我发现鼠标放到此处时会弹出用户的相关信息,所以此处应该可能会有一个请求用户信息的接口

现在我们打开开发者工具,重新把鼠标放到此处时,

果然发现了请求,结果为json数据,然后将结果复制到json在线这个网站解析,然后发现正是我们想要的数据,(这里就不贴数据了)

此时我们分享这个请求http://tieba.baidu.com/home/get/panel?ie=utf-8&un=du_%E5%B0%8F%E9%99%8C

在请求多人后,发现是根据un这个参数去区分不同的人的,在下图中列出了un这个参数,根据经验可知,这个应该用户的注册用户名,

那么我们从哪里获取这个字段呢,

既然它根据这个字段请求了后端接口,那么页面上肯定有这个字段,这时候我们打开开发者工具,查看源代码,在页面定位到这个元素,然后我们发现

un字段就在这里,那么我们就可以用这个字段去拼接url了,通过测试后,发现正确

3.代码

爬虫分析完了,这时候就要开始写代码了

首先请求页面

发送请求,然后parseList()

代码语言:javascript
复制
def tiebaSpider(self,key,beginPage,endPage):
    #配置url请求链接和请求头
    beginPage = (beginPage - 0) * 50
    endPage = (endPage+1) * 50
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"}
    for page in range(beginPage,endPage,50):
        url="http://tieba.baidu.com/f?kw=%s&ie=utf-8&pn=%s"%(key,page)
        #发送get请求
        response=requests.get(url,headers=headers)
        self.parseList(response.text)

解析贴吧页面:

利用beautifulSoup解析页面,

find()函数查找一条符合的数据,第一个参数为html的标签; 如果根据id找,则使用id参数

find_all()查找所有符合的数据,如果根据class去找,则使用class_参数,

如果直接根据标签去找,则不需要id或者class_参数,下面的方法都有用到

在解析中,我先找到了a标签,然后提取其的href数据,提取方式为a['href']

获取属性值后进行切割,切割的是?un=之后和第一个&之前的数据,

如果这个数据不为空,则发送请求获取用户信息

代码语言:javascript
复制
def parseList(self,response):
        #解析列表页,创建bs4
        soup =BeautifulSoup(response,'html.parser')
        #根据页面解析获取ul标签
        ul=soup.find("ul",id='thread_list')
#获取下面的li标签
        liList=ul.find_all('span',class_='frs-author-name-wrap')
        #解析获取需要的数据
        for li in liList:
            a=li.find('a')
            un=a['href'].split('&')[0].split('?un=')[-1]
            if un!='' and un !=None:
                #拼接请求了解,获取用户信息
                response=requests.get("http://tieba.baidu.com/home/get/panel?ie=utf-8&un="+un)
                print("http://tieba.baidu.com/home/get/panel?ie=utf-8&un="+un)
                print(response.url)
                self.parseDetail(response.text)

解析用户信息

因为这个是json数据,所以直接用json包去解析即可,然后存入mongodb中

#解析用户信息 def parseDetail(self,response): try: info=json.loads(response) #利用json的loads方法将json字符串转换成字典类型取值 data=info['data'] result = {} result['name']=data['name'] result['name_show']=data['name_show'] sex=data['sex'] if sex=='female': result['sex']='女' elif sex=='male': result['sex']='男' else: result['sex']='未知' result['tb_age']=data['tb_age'] result['id']=data['id'] result['post_num']=data['post_num'] result['tb_vip']=data['tb_vip'] result['followed_count']=data['followed_count'] self.collection.insert_one(result) except: pass

4.总结

到此整个项目做完了

但是依然有一些改进之处,我将思路和想法写下来,大家学习的时候,可以自己去尝试一下,

1.没有去做去重,这样会导致大量的重复数据

解决思路:可以将请求用户信息的了解进行保存,然后再次请求时,先去验证有没有请求过

2。反扒,在请求第二个链接时,会出现重定向,经过postman请求发现,不是链接的问题,那只能是频繁请求被封,

解决思路:配置请求头,放宽请求时间等。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 初级程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档