一、数据解析
1、聚焦爬虫:爬取页面中指定的页面内容
- 进行指定标签的定位
- 标签或者标签对应的属性中存储的数值进行提取(解析)
二、正则表达式完成数据解析
1、爬取糗事百科中的糗图
import requests
if __name__ == '__main__':
# 如何爬取网页中的图片
url = "https://pic.qiushibaike.com/system/pictures/12366/123668146/medium/T8V6MO4WYSVRSVEX.jpg"
response = requests.get(url)
# content属性返回的就是二进制形式的图片数据
image_data = response.content
"""
text 返回字符串
json 返回json格式数据
content 返回二进制形式的数据
"""
# wb 以二进制的形式 写入到文件中
with open("./qiutu.jpg", "wb") as fp:
fp.write(image_data)
2、进阶版 先通过通用爬虫爬取整张页面的数据,通过聚焦爬虫 获得图片链接,再爬取图片
<div class="thumb">
<a href="/article/123839633" target="_blank">
<img src="//pic.qiushibaike.com/system/pictures/12383/123839633/medium/G2B3PLMDBPU3APG1.jpg" alt="糗事#123839633" class="illustration" width="100%" height="auto">
</a>
</div>
观察源码发现,所有的图片都在一个又一个的class=”thumb”的div中
ex = '<div class="thumb">.*?<img src=(.*?)" alt.*?</div>'
如果正则作用到爬虫,那么findall() 方法第三个参数 必须是 re.S
re.findall(正则表达式,”字符串”,re.S)
import requests
import re
import os
if __name__ == '__main__':
# 创建一个文件夹,用来保存所有的图片
if not os.path.exists("./qiutuLibs"):
os.mkdir("./qiutuLibs")
# 设置一个通用的url模板,可以分页查询的
for pageNum in range(1, 36):
url = "https://www.qiushibaike.com/imgrank/page/%d" % pageNum
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64)"
" AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"
}
# 对页面进行第一次爬取
response = requests.get(url, headers=headers)
page_text = response.text
# 通过正则表达式将img的src属性爬取出来
ex = '<div class="thumb">.*?<img src=(.*?)" alt.*?</div>'
# 通过正则匹配 将Img的src属性匹配出来
imgSrc_list = re.findall(ex, page_text, re.S)
# 进行二次爬取,将src属性作为地址 发送get请求
i = 0
for x in imgSrc_list:
# 拼接出一个完整的图片地址 url
x = "https:" + x
x = x.replace("\"", "")
print(x)
# 对图片地址发起请求
img_response = requests.get(url=x, headers=headers)
# 拿到响应数据
img_info = img_response.content
# 文件名
file_name = x.split('/')[-1]
i += 1
# 将文件存储到类路径下qiutuLibs下 wb是以二进制的方式写入
with open("./qiutuLibs/"+file_name, "wb") as fl:
fl.write(img_info)
print("爬取完毕")
三、re模块 正则模块
- python内置模块
- 正则表达式本身就是匹配字符串的一种规则
- re模块的方法 | 方法 | 详情 | | —- | —- | | re.match() | 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回none. | | re.search() | 扫描整个字符串并返回第一个成功的匹配 | | re.compile() | 用于编译正则表达式,生成一个正则表达式(Pattern)对象 | | re.findall() | 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回一个空列表 |
import re
# 先将正则表达式编译为一个 正则表达式对象
pa = re.compile("^go+gle$")
str2 = "google"
# 传入一个正则表达式对象,一个要匹配的字符串
print(re.match(pa, str2))