对百度贴吧的爬取,主要利用了request库和re库分别获取贴吧的包和内容,最后输出贴吧所有的评论和链接。
获取百度贴吧的界面内容
def get_data(self, url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
' AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.33'}
response = requests.get(url, headers=headers)
# with open("response.html", 'wb') as f:
# f.write(response.content)
# print(response.text)
# 利用content返回字符串bytes,并利用decode进行编译
return response.content.decode()
headers是本人浏览器的表头,以自己浏览器为主。
request.get(url)获取url的内容。
释放注释内容
高级浏览器会自动把展示的内容作为注释,调用注释的内容,因此我们需要将注释的内容给提取出现。
# 请求获得界面
data = self.get_data(next_url)
# 把高等级浏览器注释掉的部分释放出来
data = data.replace('<!--,', '').replace('-->', '')
如果学过html,应该很容易想到注释的语法,利用<!–" 和 “–>” 将内容括起来,因此我们需要利用字符串替换方法replace将注释语法去除。
利用正则表达式获取贴吧单个页面的帖子和链接
在对贴吧内容的提取上有很多种方式,xpath、re、直接对标签的查询等,这些方式都能让我们快速找到。(虽然xpath确实非常快,但是因为re学习比较得心应手,因此习惯用re了)
# 正则获得贴吧信息和url
get_url = re.findall(r'a rel=\".*\" href=\"(.*)\" title=\".*\" target=\"_blank\" class=\"j_th_tit', data)
get_title = re.findall(r'a rel=\".*\" href=\".*\" title=\"(.*)\" target=\"_blank\" class=\"j_th_tit', data)
对得到的评论和链接进行处理
在得到其内容后,我们需要将评论和链接给对上,不可能放成一团,这样我们就不知道评论对应的链接,在数据可视化上比较差。
# (获得url只有尾数,得在前面添加https://tieba.baidu.com)
data_list = []
for item in range(0, len(get_title)):
temp = {}
temp['title'] = get_title[item]
temp['url'] = 'https://tieba.baidu.com' + get_url[item]
data_list.append(temp)
这里可以利用字典,将内容放入,以方便我们提取。
循环翻页获取内容
一般的帖子肯定不止一页,因此我们需要对帖子进行翻页,直到最后一页。
# 循环翻页获得页面信息,利用try进行判断,如果错误则表示到页数限制
try:
# 后面的url需要加前缀https:
next_url = 'https:' + re.findall(r'href=\"(.*)\" class=\".*\" >下一页', data)[0]
except:
next_url = None
for show_data in data_list:
print(show_data)
print(next_url)
最后在给出主函数
if __name__ == '__main__':
url = 'https://tieba.baidu.com/f?ie=utf-8&kw='
name = '洛杉矶湖人'
next_url = url + name
baidu = Baidu()
# 循环利用下一页next_url,当next_url为空时到达最后一页,完成提取。
while True:
next_url = baidu.run(next_url)
if next_url == None:
break
补充run函数模块
def run(self, next_url):
# 获取url
# headers
# 请求获得界面
data = self.get_data(next_url)
# 把高等级浏览器注释掉的部分释放出来
data = data.replace('<!--,', '').replace('-->', '')
# 正则获得贴吧信息和url
get_url = re.findall(r'a rel=\".*\" href=\"(.*)\" title=\".*\" target=\"_blank\" class=\"j_th_tit', data)
get_title = re.findall(r'a rel=\".*\" href=\".*\" title=\"(.*)\" target=\"_blank\" class=\"j_th_tit', data)
# (获得url只有尾数,得在前面添加https://tieba.baidu.com)
data_list = []
for item in range(0, len(get_title)):
temp = {}
temp['title'] = get_title[item]
temp['url'] = 'https://tieba.baidu.com' + get_url[item]
data_list.append(temp)
# print(temp)
# 循环翻页获得页面信息,利用try进行判断,如果错误则表示到页数限制
try:
# 后面的url需要加前缀https:
next_url = 'https:' + re.findall(r'href=\"(.*)\" class=\".*\" >下一页', data)[0]
except:
next_url = None
for show_data in data_list:
print(show_data)
print(next_url)
return next_url
源文件地址:https://download.youkuaiyun.com/download/Single_minde/85624706

本文介绍了如何使用Python通过requests和正则表达式技术从百度贴吧抓取帖子内容、评论和链接,实现多页数据的收集,适合初学者了解网页爬虫技术的应用。
1987

被折叠的 条评论
为什么被折叠?



