在上一章学习中,介绍了网络爬虫的作用和在Python中使用自带模块urllib.request的步骤。并且提到了当服务器后台提供动态数据时,可使用charles等软件获取动态数据的接口地址,得到的json数据可用python自带模块内存的数据结构的形式存储。但是爬虫时,很多情况下,数据会直接显示在网页上,需要获取全部网页数据后,在进一步加以分析,提取有用数据,进行存储或者其他操作。在本章学习中,我们通过正则表达式对于网页数据进行分析,提取有效数据。
需求:
爬取https://www.qiushibaike.com/text/page/1/网址的数据,获取每一条数据的发布者和内容,将信息存储到字典中。
涉及到的知识点:
1.爬虫获取网页数据的过程
2.通过正则表达式匹配符合要求的标签
3.将获取到的数据(满足要求的数据)存放到容器当中 (二维列表,字典)
逻辑分析:
本章中需要重点掌握的是理解正则表达式在python当中的使用,具体内容可通过菜鸟教程进行学习。
功能实现代码:
import urllib.request
import re
def htmlCrawler(url):
# 1.模拟请求头
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
}
#2.获取请求体
req = urllib.request.Request(url,headers=headers)
#3.得到响应对象
response = urllib.request.urlopen(req)
#4.获取相应数据
HTML = response.read().decode('utf-8')
# 正则表达式分析: 找开始和结束标签,两个标签之间把想要的内容需要包含进来,然后依次查找分析。
pat = r'<div class="author clearfix">(.*?)<span class="stats-vote"><i class="number">'
# 使用findall方法查找符合要求的全部内容,放置到一个列表
divlist = re.findall(pat,HTML,re.S) #re.S : 是.匹配包括换行之内的所有字符
#因为要获取每一条数据的发布者和内容,就需要去遍历列表
#存放的容器
dic = {}
for div in divlist:
#用户名匹配的正则
name_pat = r'<h2>(.*?)</h2>'
# 开始查找h2标签,发现每一条只有一个h2标签,
userlist= re.findall(name_pat,div,re.S)
username = userlist[0]
# 段子
content_pat = r'<div class="content">\n<span>(.*?)</span>'
contentlist = re.findall(content_pat,div,re.S)
content = contentlist[0]
#将名称和段子存储到字典容器当中
dic[username] = content
return dic
if __name__ == '__main__':
url = 'https://www.qiushibaike.com/text/page/1/'
dic = htmlCrawler(url)
for k,v in dic.items():
print(k,":",v)
运行代码,打印在控制台的效果为:
本篇博客代码下载地址:https://download.csdn.net/download/u012156341/11128450
感谢您的阅读!