对于自动化办公而言,网络数据的批量获取完数据可以节约相当的时间,因此爬虫在自动化办公中占据了一个比较重要的位置。
Requests简介
Requests是一款目前非常流行的http请求库,使用python编写,能非常方便的对网页Requests进行爬取,也是爬虫最常用的发起请求第三方库。
安装方法:
pip install requests
或者conda安装
conda install requests
re.status_code 响应的HTTP状态码
re.text 响应内容的字符串形式
rs.content 响应内容的二进制形式
rs.encoding 响应内容的编码
试一试对百度首页进行数据请求:
import requests
# 发出http请求
re=requests.get("https://www.baidu.com")
# 查看响应状态
print(re.status_code)
#输出:200
#200就是响应的状态码,表示请求成功
#我们可以通过res.status_code的值来判断请求是否成功。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210628215133950.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTY5NjE2MQ==,size_16,color_FFFFFF,t_70)
res.text 返回的是服务器响应内容的字符串形式,也就是文本内容
例:用爬虫下载孔乙己的文章,网址是https://apiv3.shanbay.com/codetime/articles/mnvdu
我们打开这个网址 可以看到是鲁迅的文章
我们尝试着用爬虫保存文章的内容
re.txt就是网页中的内容,将内容保存到txt文件中
**re.text用于文本内容的获取、下载
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210628215221656.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTY5NjE2MQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210628215243258.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTY5NjE2MQ==,size_16,color_FFFFFF,t_70)
re.content用于图片、视频、音频等内容的获取、下载
import requests
# 发出http请求
#下载图片
res=requests.get('https://img-blog.csdnimg.cn/20210424184053989.PNG')
# 以二进制写入的方式打开一个名为 info.jpg 的文件
with open('datawhale.png','wb') as ff:
# 将数据的二进制形式写入文件中
ff.write(res.content)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210628215419892.png)
re.encoding 爬取内容的编码形似,常见的编码方式有 ASCII、GBK、UTF-8 等。如果用和文件编码不同的方式去解码,我们就会得到一些乱码。
HTML解析和提取
浏览器工作原理:
向浏览器中输入某个网址,浏览器回向服务器发出请求,然后服务器就会作出响应。其实,服务器返回给浏览器的这个结果就是HTML代码,浏览器会根据这个HTML代码将网页解析成平时我们看到的那样
比如我们来看看百度的html页面
import requests
res=requests.get('https://baidu.com')
print(res.text)
将会看到很多带有标签的信息
**HTML(Hyper Text Markup Language)**是一种超文本标记语言,是由一堆标记组成。
例如
<html>
<head>
<title>我的网页</title>
</head>
<body>
Hello,World
</body>
</html>
上面即为一个最简单的html,我们所需要的信息就是夹在标签中
想对html有根据深入的了解,可以html菜鸟教程
https://www.runoob.com/html/html-tutorial.html
那么我们如何解析html页面呢?
BeautifulSoup简介
我们一般会使用BeautifulSoup这个第三方库
安装方法:
pip install bs4
或
conda install bs4
我们来解析豆瓣读书 Top250
它的网址是:https://book.douban.com/top250
import io
import sys
import requests
from bs4 import BeautifulSoup
###运行出现乱码时可以修改编码方式
#sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
###
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
res = requests.get('https://book.douban.com/top250', headers=headers)
soup = BeautifulSoup(res.text, 'lxml')
print(soup)
python 打印信息时会有限制 我们将打印的编码改成gb18030
headers表示我们的请求网页的头,对于没有headers的请求可能会被服务器判定为爬虫而拒绝提供服务
通过 from bs4 import BeautifulSoup 语句导入 BeautifulSoup
然后使用 BeautifulSoup(res.text, lxmlr’) 语句将网页源代码的字符串形式解析成了 BeautifulSoup 对象
解析成了 BeautifulSoup 对象可以较为方便的提取我们需要的信息
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210628215602649.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTY5NjE2MQ==,size_16,color_FFFFFF,t_70)
那么如何提取信息呢?
BeautifulSoup 为我们提供了一些方法
find()方法和find_all()方法:
-
find() 返回符合条件的首个数据
-
find_all() 返回符合条件的所有数据
import io
import sys
import requests
from bs4 import BeautifulSoup
#如果出现了乱码报错,可以修改编码形式
#sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
#
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
res = requests.get('https://book.douban.com/top250', headers=headers)
soup = BeautifulSoup(res.text, 'lxml')
print(soup.find('a'))
#<a class="nav-login" href="https://accounts.douban.com/passport/login?source=book" rel="nofollow">登录/注册</a>
print(soup.find_all('a'))
#返回一个列表 包含了所有的<a>标签
除了传入 HTML 标签名称外,BeautifulSoup 还支持熟悉的定位
# 定位div开头 同时id为'doubanapp-tip的标签
soup.find('div', id='doubanapp-tip')
# 定位a抬头 同时class为rating_nums的标签
soup.find_all('span', class_='rating_nums')
#class是python中定义类的关键字,因此用class_表示HTML中的class
HTML定位方法:https://www.cnblogs.com/bosslv/p/8992410.html