大家好,我是皮皮。
一、前言
前几天在Python钻石交流群有个叫【嗨!罗~】的粉丝问了一道关于百度贴吧标题和正文图片网络爬虫的问题,获取源码之后,发现使用
xpath
匹配拿不到东西,从响应来看,确实是可以看得到源码的。上一篇文章我们使用了正则表达式获取到了目标数据和
xpath
进行了实现,分享一个使用Python网络爬虫抓取百度tieba标题和正文图片(xpath篇),分享一个使用Python网络爬虫抓取百度tieba标题和正文图片(正则表达式篇),这篇文章,我们使用
bs4
来进行实现。
二、实现过程
究其原因是返回的响应里边并不是规整的
html
格式,所以直接使用
xpath
是拿不到的。这里【dcpeng】在【月神】代码的基础上,给了一份代码,使用
bs4
实现,代码如下。
# coding:utf-8
# @Time : 2022/5/3 10:46
# @Author: 皮皮
# @公众号: Python共享之家
# @website : http://pdcfighting.com/
# @File : 百度贴吧.py
# @Software: PyCharm
import requests
from bs4 import BeautifulSoup
class TiebaSpider:
def __init__(self, name):
self.start_url = "https://tieba.baidu.com/f?kw=" + name + "&ie=utf-8&pn=0"
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
"Cookie": "你的cookie"
}
def paser_url(self, url): # 发送请求,获取响应
response = requests.get(url, headers=self.headers)
return response.content.decode()
# 第一种方法:正则表达式
# 第二种方法:xpath提取
# 第三种方法:bs4提取
def get_content_list(self, html_str):
# 数据隐藏在注释里,取消注释标识
html = html_str.replace('<!--', '').replace('-->', '')
html = BeautifulSoup(html, "lxml")
div_list = html.find_all('li', class_="j_thread_list clearfix thread_item_box")
print(len(div_list))
resp = []
for h in div_list:
title = h.find('div').find('a').text
img = h.find_all('img')
# title = h.xpath('.//div/a/text()')[0]
# img = h.xpath('.//ul//img/@bpic')
img = img[0].get('bpic') if img else ''
resp.append((title, img))
print(resp)
def run(self):
# 1.start_url
# 2.发送请求,获取响应
html_str = self.paser_url(self.start_url)
# print(html_str)
# 3.提取数据,提取下一页的url地址
self.get_content_list(html_str)
# 4.保存数据
if __name__ == '__main__':
tieba_spider = TiebaSpider("李毅")
tieba_spider.run()
复制
这个代码亲测好使,运行之后结果如下。
三、总结
大家好,我是皮皮。这篇文章主要分享一个使用Python网络爬虫抓取百度tieba标题和正文图片(
bs4
篇),行之有效。目前我们已经实现了分别使用正则表达式、
xpath
和
bs4
三种方法来提取百度贴吧的标题和正文图片链接,也欢迎大家积极尝试,一起学习。
最后感谢粉丝【嗨!罗~】提问,感谢【dcpeng】、【月神】在运行过程中给出的代码建议,感谢粉丝【猫药师Kelly】等人参与学习交流。