1.基础概念
爬虫:模拟客户端(浏览器)发送网络请求,接收请求返回的响应,一种按照一定的规则,自动地抓取互联网信息的程序.
爬虫流程:
- 获取url。
- 向url发送请求,并且获取相应。
- 从相应中获取url,并且持续获取相应。
- 从响应中提取数据并保存。
常见的抓取方式
- 在网页中我们能看到各种各样的信息,最常见的便是常规网页,它们对应着HTML.代码,而最常抓取的便是HTML源代码。
- 有些网页返回的不是HTMIL代码,而是一个JSON字符串(其中API接口大多采用这样的形式),这种格式的数据方便传输和解析,它们同样可以抓取,而且数据提取更加方便。
- 各种二进制数据,如图片、视频和音频等。利用爬虫,我们可以将这些二进制数据抓取下来,然后保存成对应的文件名。
- 还可以看到各种扩展名的文件,如CSS、JavaScript和配置文件等,这些其实也是最普通的文件,只要在浏览器里面可以访问到,就可以将其抓取下来。
上述内容其实都对应各自的URL,是基于HTTP或HTTPS协议的,只要是这种数据,爬虫都可以抓取。
有些网页的HTML文本仅为空壳。
这是一个非常常见的问题。现在网页越来越多地采用Ajax、前端模块化工具来构建,整个网页可能都是由JavaScript渲染出来的,也就是说原始的HTML代码就是一个空壳。此时这种情况不能简单的使用HTML库。
2.测试爬虫流程
"""
爬虫流程:
1. 获取url。
2. 向url发送请求,并且获取相应。
3. 从相应中获取url,并且持续获取相应。
4. 从响应中提取数据并保存。
"""
import requests
# 获取url
url = 'https://www.baidu.com/'
# 向url发送HTTP请求
response = requests.get(url)
# 从响应中提取数据并保存。
print(response) # <Response [200]>
# print(response.text) 出现乱码
print(response.content.decode()) # 解决乱码,decode默认utf-8编码
3.爬虫常见请求模块(uellib、requests)
requets库:基于urllib模块实现。向服务器发送请求库。
Ⅰurllib
urllib模块:它是Python内置的HTTP请求库,不需要额外安装即可使用。它包含如下4个模块。(与requests区分开)
- request:它是最基本的HTTP请求模块,可以用来模拟发送请求。需要给库方法传入URL以及额外的参数,就可以模拟实现这个过程了。
- error:异常处理模块,如果出现请求错误,可以捕获这些异常,然后进行重试或其他操作以保证程序不会意外终止。
- parse:一个工具模块,提供了许多URL处理方法,比如拆分、解析、合并等。
- robotparser:主要是用来识别网站的 robots.txt文件,然后判断哪些网站可以爬,哪些网站不可以爬,用得比较少。
使用urllib的 request模块,可以方便地实现请求的发送并得到响应。下面是具体用法。
urlopen:
urllib.request模块提供了最基本的构造HITP请求的方法,利用它可以模拟浏览器的一个请求发起过程,同时它还带有处理授权验证(authentication)、重定向(redirection)、浏览器Cookies 以及其他内容。
使用方法:
import urllib.request
url = 'https://www.baidu.com/'
response = urllib.request.urlopen(url)
print(response.read().decode('utf-8'))
print(type(response))
可以看出返回的是一个http客户端相应类。
这个类有自己的方法,主要包含read、readinto、getheader、getheaders、fileno等方法,和msg、version、status、reason、debuglevel、closed等属性。
如果需要向请求报文中添加信息,可以修改函数的data参数
注意:
data参数是可选的。如果要添加该参数,需要使用bytes方法将参数转化为字节流编码格式的内容,即 bytes类型。另外,如果传递了这个参数,则它的请求方式就不再是 GET方式,而是 POST方式。
Ⅱ requests
urllib这个库已经很久了,requests库封装了urllib库,使用更简单。基本使用如下图
import requests
import webbrowser # 自动打开网页
key = input('输入查询内容')
print(key)
url = 'https://www.baidu.com/s?wd=' + key
# 系统信息,浏览器信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}
response = requests.get(url, headers=headers)
html = response.content.decode('utf-8')
with open('baidu-copy.html', 'w', encoding='utf-8') as file:
file.write(html)
webbrowser.open('baidu-copy.html')
其中浏览器信息可以在网页中查找:
注意测试代码时关闭代理服务器