爬虫:模拟客户端(浏览器)发送网络请求,接收请求返回的响应,一种按照一定的规则,自动地抓取互联网信息的程序.
爬虫流程:
常见的抓取方式
上述内容其实都对应各自的URL,是基于HTTP或HTTPS协议的,只要是这种数据,爬虫都可以抓取。
有些网页的HTML文本仅为空壳。
这是一个非常常见的问题。现在网页越来越多地采用Ajax、前端模块化工具来构建,整个网页可能都是由JavaScript渲染出来的,也就是说原始的HTML代码就是一个空壳。此时这种情况不能简单的使用HTML库。
"""
爬虫流程:
1. 获取url。
2. 向url发送请求,并且获取相应。
3. 从相应中获取url,并且持续获取相应。
4. 从响应中提取数据并保存。
"""
import requests
# 获取url
url = 'https://www.baidu.com/'
# 向url发送HTTP请求
response = requests.get(url)
# 从响应中提取数据并保存。
print(response) #
# print(response.text) 出现乱码
print(response.content.decode()) # 解决乱码,decode默认utf-8编码
requets库:基于urllib模块实现。向服务器发送请求库。
urllib模块:它是Python内置的HTTP请求库,不需要额外安装即可使用。它包含如下4个模块。(与requests区分开)
使用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方式。
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')
其中浏览器信息可以在网页中查找:
注意测试代码时关闭代理服务器