一、数据解析
1、聚焦爬虫:爬取页面中指定的页面内容
- 进行指定标签的定位
- 标签或者标签对应的属性中存储的数值进行提取(解析)
二、正则表达式完成数据解析
1、爬取糗事百科中的糗图
import requestsif __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 requestsimport reimport osif __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" % pageNumheaders = {"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 = 0for x in imgSrc_list:# 拼接出一个完整的图片地址 urlx = "https:" + xx = 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))
