【python爬虫】第1章——Python网络爬虫之三种数据解析方式
【python爬虫】第1章——Python网络爬虫之三种数据解析方式
回顾requests实现数据爬取的流程
指定url基于requests模块发起请求获取响应对象中的数据进行持久化存储
其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据解析。因为大多数情况下的需求,我们都会指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是整个页面的数据。因此,本次课程中会给大家详细介绍讲解三种聚焦爬虫中的数据解析方式。至此,我们的数据爬取的流程可以修改为:
指定url基于requests模块发起请求获取响应中的数据数据解析进行持久化存储
今日概要
正则解析 xpath解析 bs4解析 知识点回顾
requests模块的使用流程 requests模块请求方法参数的作用 抓包工具抓取ajax的数据包
一.正解解析
常用正则表达式回顾: 单字符:
. : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d :数字 [0-9] \D : 非数字 \w :数字、字母、下划线、中文 \W : 非\w \s :所有的空白字符包,括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 \S : 非空白数量修饰: * : 任意多次 >=0 + : 至少1次 >=1 ? : 可有可无 0次或者1次 {m} :固定m次 hello{3,} {m,} :至少m次 {m,n} :m-n次边界: $ : 以某某结尾 ^ : 以某某开头分组: (ab) 贪婪模式: .*非贪婪(惰性)模式: .*?re.I : 忽略大小写re.M :多行匹配re.S :单行匹配re.sub(正则表达式, 替换内容, 字符串)
回顾练习:
import re#提取出pythonkey="javapythonc++php"re.findall('python',key)[0]######################################################################提取出hello worldkey="
hello world"re.findall('(.*)',key)[0]######################################################################提取170string = '我喜欢身高为170的女孩're.findall('\d+',string)######################################################################提取出and #输出hellore.findall('<[Hh][Tt][mM][lL]>(.*)[Hh][Tt][mM][lL]>',key)######################################################################提取出hit. key='bobo@hit.edu.com'#想要匹配到hit.re.findall('h.*?\.',key)######################################################################匹配sas和saaskey='saas and sas and saaas're.findall('sa{1,2}s',key)######################################################################匹配出i开头的行string = '''fall in love with youi love you very muchi love shei love her'''re.findall('^.*',string,re.M)######################################################################匹配全部行string1 = """静夜思窗前明月光疑是地上霜举头望明月低头思故乡"""re.findall('.*',string1,re.S)
(.*)',key)[0]######################################################################提取170string = '我喜欢身高为170的女孩're.findall('\d+',string)######################################################################提取出and #输出hellore.findall('<[Hh][Tt][mM][lL]>(.*)[Hh][Tt][mM][lL]>',key)######################################################################提取出hit. key='bobo@hit.edu.com'#想要匹配到hit.re.findall('h.*?\.',key)######################################################################匹配sas和saaskey='saas and sas and saaas're.findall('sa{1,2}s',key)######################################################################匹配出i开头的行string = '''fall in love with youi love you very muchi love shei love her'''re.findall('^.*',string,re.M)######################################################################匹配全部行string1 = """静夜思窗前明月光疑是地上霜举头望明月低头思故乡"""re.findall('.*',string1,re.S)
项目需求:爬取糗事百科指定页面的糗图,并将其保存到指定文件夹中
#!/usr/bin/env python# -*- coding:utf-8 -*-import requestsimport reimport osif __name__ == "__main__": url = ' headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #指定起始也结束页码 page_start = int(input('enter start page:')) page_end = int(input('enter end page:')) #创建文件夹 if not os.path.exists('images'): os.mkdir('images') #循环解析且下载指定页码中的图片数据 for page in range(page_start,page_end+1): print('正在下载第%d页图片'%page) new_url = format(url % page) response = requests.get(url=new_url,headers=headers) #解析response中的图片链接 e = '