前言
上篇文章我们使用了原生urllib3库进行爬虫,但我们对爬取到的网页还需解码,很不方便,我们这次就使用另一个叫做requests的库
正文
使用requests库的方式
- 如果没有requests可以通过在虚拟环境中执行
pip install requests
安装 - 编写程序
# @File: code02.py # @Author: lengwen # @Time: 2019-07-25 10:14 # @Desc: 使用requests库的方式 import requests resp = requests.get('http://www.163.com') # 状态码 print("状态码:", resp.status_code) # 编码 print("编码", resp.encoding) # 响应内容 print(resp.text)
- 结果
[外链图片转存失败(img-6Vb5opeA-1564032774845)(https://raw.githubusercontent.com/kevinlu98/cloudimg/master/data/QQ20190725-101738@2x.png)]
我们可以看到requests帮我们封装好了响应结果,我们需要什么直接取什么就可以了
- 结果
解析网页
-
光爬取到数据还不够,我们上篇文章说过爬到的数据还需要解析,解析出我们需要的有用的东西
-
通常解析的方法
- 正则表达式
- xpath
- BeautifulSoup
-
正则表达式的方式解析数据
-
需求: 我们先访问目标网页http://www.163.com,我们的需求就是爬取出里面的新闻链接
[外链图片转存失败(img-dKZxiwDn-1564032774845)(https://raw.githubusercontent.com/kevinlu98/cloudimg/master/data/QQ20190725-102404@2x.png)] -
通过审查元素我们发现新闻链接都有一些共性,
[外链图片转存失败(img-MqDpp8bl-1564032774846)(https://raw.githubusercontent.com/kevinlu98/cloudimg/master/data/QQ20190725-103517@2x.png)]- 都在
<li></li>
中,并且这个<li>
可能有class
属性 - 都是
<a>
标签, 并且href
都是以https://news.163.com/数字
开头
- 都在
-
找到这些共性就好说了,我们先构建正则表达式
<li.*><a href="(https://news.163.com/\d.*?)">(.*?)</a>
关于这个正则表达式简单的说下[]
:代表里面的字符是一个整体?
:代表之前的字符串要么不出现,要么出现一次.
:匹配除换行符 \n 之外的任何单字符*
:匹配前面的子表达式零次或多次\d
:匹配数字
所以在看上面的正则表达式
.*?
: 任意字符出现0到任意多次
-
现在用一些正则工具测下我们的正则表达式http://tool.oschina.net/regex/
- 粘贴我们刚刚爬取到的网页内容
- 粘贴我们的正则表达式
- 然后进行匹配
[外链图片转存失败(img-vKn4ofjU-1564032774847)(https://raw.githubusercontent.com/kevinlu98/cloudimg/master/data/QQ20190725-110351@2x.png)]
-
我们通过编写Python程序进行匹配
# @File: coed03.py # @Author: lengwen # @Time: 2019-07-25 10:22 # @Desc: 正则表达式的方式解析数据 import requests # 导入re正则库 import re url = 'http://www.163.com' resp = requests.get(url) # 构建正则表达式字符串 字符串前面的r代表不转义字符串里的内容 pattern_str = r'<li.*><a href="(https://news.163.com/\d.*?)">(.*?)</a>' # 转换为正则表达式 pattern = re.compile(pattern_str) # 查找所以匹配结果,我们需要匹配的内容在正则表达式中的()中 news_datas = re.findall(pattern, resp.text) print(len(news_datas)) for data in news_datas: print(data)
我们看下结果,一条连接,一个标题 ,我们想要的结果出来了
[外链图片转存失败(img-4VmpymPL-1564032774848)(https://raw.githubusercontent.com/kevinlu98/cloudimg/master/data/QQ20190725-110556@2x.png)]
我们正则方式的解析至此已经完成