requests请求
1. 新建python file尽量使用英文命名
2. requests作用:发送请求,获取相应数据
3. 发送get请求:response = requests.get(url)
4. 导入模块一般要与下一行命令有一行空格
5. print(response.encoding) 表示使用什么样的编码 print(response.encoding = ‘utf-8’)表示使用utf-8进行编码
6. print(response.text) 是一个解码
7. print(response.content) 是获取相应的二进制数据
b'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta (b打头,表示二进制数据)
8. print(response.content.decode() )默认是使用utf-8进行解码【对二进制数据进行解码】
9. print(response.content.decode())是 print(response.encoding = ‘utf-8’)和print(response.text)的结合【使两行数据变成一行,简便】
10. print(response.content.decode(encoding='gbk'))则是进行gbk的解码
案例:
url:http://ncov.dxy.cn/ncovh5/view/pneumonia(丁香园疫情数据网页地址)
requests安装:我是通过pycharm的settings去添加库
再通过Python Interpreter点击加号去添加requests库
Beautiful Soup
Beautiful Soup是一个可以从HTML或XML文件中提取数据的python库
为什么输入的是soup = BeautifulSoup('<html>data</html>','lxml'),但是运行出来的是<html><body><p>data</p></body></html>,因为BeautifulSoup会自动对代码进行一个补全
head,body是html的子标签,而html是head,body的父标签
title是head的子标签,head是title的父标签
html是title的祖先标签,title是html的后代标签
p标签有一个属性叫class,值是title
a标签有一个hrefclass,id的属性,其值就不一一描述了,Elsie是a标签的文本内容
1. name指定a,则会把a标签给找出来,如果指定title,就会把title标签给找出来
2. atrs指定class:title就可以把p标签给找出来,如果指定id:link1,则就会把a标签给找出来
3. 若recursive=False,只会查找子标签(例:如果name=title,recursive=False,则会找不到,因为html里的子标签只有head和body),所以一般recursive的默认值都是True
4. text若指定Eisle,则会查找到Eisle的文本内容
5. find是查找到第一个元素对象,而find_all则是查找到所有的元素对象
例题:
查找title,a,所有a标签
案例:从疫情首页提取各国最新的疫情数据
url:http://ncov.dxy.cn/ncovh5/view/pneumonia(丁香园疫情数据网页地址)
正则表达式常见语法:
正则表达式是一种字符串匹配模式,作用是从某个字符串中提取符合某种条件的子串。
点只能匹配除换行符(\n)以外的,不然都匹配不上
预定义字符:
\d只能匹配一个字符
\w只能匹配字母,数字,下划线,中文,其他就不行(特殊字符)
不象只匹配一个字符,可以在\d后面加上\d*,但会出现空字符串,原因是\d*是允许匹配空的,入宫不想有空字符串,可以随便加一个字符,如a\d*,这样就限制了只有一个字符串,但是内容里也必须含有a,不然匹配不上
/d*如果只有一个a,是可以匹配上的,因为可以出现0次或无限次的数字,但是如果是/d+只有一个a的话就不行,因为必须出现一次或者无限次数字 ,如果是a1的话就可以了
/d?只能出现0次或者1次数字,若内容是a123时,只会出现第一个数字1,同理如果只有a也可以匹配,运行为[a]。
还可以用{}来规定要输出的字符大小。
re.findall()方法
re.findall()查找字符串所有与正则匹配的子串,返回一个列表,若果没有找到返回空列表。
正常的点号和换行符是不匹配的,这个时候用上re.DOTALL或者是re.S,就可以匹配所有的字符
关于re.findall()分组的使用
如果是不分组,则返回与整个正则匹配的列表。
rs = re.findall('a.+bc','a\nbc',re.DOTALL)#['a\nbc']
如果是有分组,则返回出分组(有小括号)匹配的列表,两边的东西都是负责确定提取数据所在的位置。
rs = re.findall('a(.+)bc','a\nbc',re.DOTALL)#['\n']
r原串的使用
在python正则表达式中,一个转义符需要四个转义符匹配,比较麻烦,所以使用r原始字符串,能够忽略转义符带来的影响,待匹配的字符串中有多少个\,r原串正则中就添加多少个\即可。
rs = re.findall(r'a\\nbc','a\\nbc')#['a\\nbc']
而r原串对换行符也没有任何影响
rs = re.findall(r'a\nbc','a\nbc')#['a\nbc']
拓展:r原串还可以解决写正则的时候,不符合PEP8的问题
这个时候使用r原串就可以解决这个问题
rs = re.findall(r'\d','a123')#['1', '2', '3']
案例:提取最新的各国疫情数据中的json的字符串
json模块:
json模块是python自带的模块,用于json与python数据之间的相互转换。
json转化为python的核心代码:
python类型数据转化为json字符串的核心代码:
python类型数据以json格式写入文件的核心代码:
案例:解析最新的疫情数据的json字符串
核心代码:
疫情爬虫项目:
实现采集最近一日中国各省疫情数据:
id等于多少,看网页源代码的<body><scripr id=""><body>
各省id前面一张图片,各市id后面那张图片
要把json源文件提前新建在目录下,不然无法找到该文件
核心代码: