urllib(库).request(请求)默认只支持HTTP/HTTPS的GET和POST方法
Urllib库
urllib(库).request(请求)默认只支持HTTP/HTTPS的GET
和POST
方法
Python urllib 库用于操作网页 URL,并对网页的内容进行抓取处理。
urllib 包
包含以下几个模块:
urllib.request - 打开和读取 URL。
urllib.error (错误)- 包含 urllib.request 抛出的异常。
urllib.parse(解析) - 解析 URL。
urllib.robotparser(机器人解析) - 解析 robots.txt 文件。
urllib.request
urlopen函数
访问百度的网站,爬取网站的信息。打印的信息就是网页的内容,html文件的内容。
通过开发者工具:ctrl+F12查看百度网站的源码,发现是一样的,这样就获取到了网页的信息了。
urllib.request 定义了一些打开 URL 的函数和类,包含授权验证、重定向、浏览器 cookies等。
urllib.request 可以模拟浏览器的一个请求发起过程。
我们可以使用 urllib.request 的 urlopen 方法来打开一个 URL,语法格式如下:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
- url:url 地址。
- data:发送到服务器的其他数据对象,默认为 None。
- timeout:设置访问超时时间。
- cafile 和 capath:cafile 为 CA 证书, capath 为 CA 证书的路径,使用 HTTPS 需要用到。
- cadefault:已经被弃用。
- context:ssl.SSLContext类型,用来指定 SSL 设置。
加入User-Agent
url="http://douban.com"
headers={
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.42"
}
data=bytes(urllib.parse.urlencode({'name':'eric'}),encoding="utf-8")
req=urllib.request.Request(url=url,data=data,headers=headers,method="POST")
response=urllib.request.urlopen(req)
print(response.read().decode("utf-8"))
随机导入User-Agent
from urllib import request
import random
ua_list = [
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36"
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36"
]
header = {"User-Agent": random.choice(ua_list)}
requests = request.Request("http://www.baidu.com", headers=header)
response = request.urlopen(requests)
html = response.read().decode('utf-8')
print(html)
data data必须是bytes(字节流)类型,如果是字典,可以用urllib.parse模块里的urlencode()编码
headers headers是一个字典类型,是请求头。可以在构造请求时通过headers参数直接构造,也可以通过调用请求实例的add_header()方法添加。可以通过请求头伪装浏览器,默认User-Agent是Python-urllib。要伪装IE浏览器,可以设置
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.42"
origin_req_host 指定请求方的host名称或者ip地址
unverifiable 设置网页是否需要验证,默认是False,这个参数一般也不用设置。
method method是一个字符串,用来指定请求使用的方法,比如GET,POST和PUT等。
Get方式
我们在对网页进行抓取时,经常需要判断网页是否可以正常访问,这里我们就可以使用 getcode() 函数获取网页状态码,返回 200 说明网页正常,返回 404 说明网页不存在:
import urllib.request
#获取一个get请求
response = urllib.request.urlopen("http://baidu.com/get")
print(response.read().decode("utf-8"))
POST方式:(带表单信息,要封装数据)
上面我们说了Request请求对象的里有data参数,它就是用在POST里的,我们要传送的数据就是这个参数data,data是一个字典,里面要匹配键值对。
import urllib.request
获取一个post请求
import urllib.parse #parse 解析器 解析bytes中的中文或者英文,按照一定格式“utf-8”,统一变成二进制
data=bytes(urllib.parse.urlencode({'HELLO':"WORD"}),encoding="utf-8")#字典方式
response=urllib.request.urlopen("http://httpbin.org/post",data=data)
print(response.read().decode("utf-8"))
获取请求头部信息
response = urllib.request.urlopen("https://baidu.com")
print(response.getheaders())
状态码(200为正常)
418 我是一个茶壶 对方已经发现你是一个爬虫
response = urllib.request.urlopen("https://douban.com/get")
print(response.status)
404 找不到
response = urllib.request.urlopen("https://baidu.com/get")
print(response.status)
200为正常
练习 捕获豆瓣
url = "http://douban.com"
import urllib.parse
headers={
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.42"
}
data=bytes(urllib.parse.urlencode({'name':'eric'}),encoding="utf-8")
req=urllib.request.Request(url=url,data=data,headers=headers)
response=urllib.request.urlopen(req)
print(response.read().decode("utf-8"))