web crawler

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自带的模块,用于jsonpython数据之间的相互转换

  json转化为python的核心代码:

 python类型数据转化为json字符串的核心代码:

python类型数据以json格式写入文件的核心代码:

 案例:解析最新的疫情数据的json字符串

 核心代码:

疫情爬虫项目

实现采集最近一日中国各省疫情数据:

id等于多少,看网页源代码的<body><scripr id=""><body> 

各省id前面一张图片,各市id后面那张图片

要把json源文件提前新建在目录下,不然无法找到该文件

核心代码: 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值