重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇文章为大家展示了python中怎么利用requests爬取百度贴吧用户信息,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
创新互联公司专注于企业营销型网站建设、网站重做改版、港南网站定制设计、自适应品牌网站建设、成都h5网站建设、商城开发、集团公司官网建设、外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为港南等各大城市提供网站开发制作服务。
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()
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=之后和第一个&之前的数据,
如果这个数据不为空,则发送请求获取用户信息
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请求发现,不是链接的问题,那只能是频繁请求被封,
上述内容就是python中怎么利用requests爬取百度贴吧用户信息,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。