json工具:https://www.json.cn/
将headers请求头字符串转为字典:https://pengshiyu.blog.csdn.net/article/details/80460612
urllib模块方法描述
urllib.request | 打开和读取 URL。定义了一些打开 URL 的函数和类,包含授权验证、重定向、浏览器 cookies等。可以模拟浏览器的一个请求发起过程。 |
---|---|
urllib.error | 包含 urllib.request 抛出的异常。(包含了两个方法:URLError是 OSError 的一个子类,用于处理程序在遇到问题时会引发此异常(或其派生的异常),包含的属性 reason 为引发异常的原因。HTTPError 是 URLError 的一个子类,用于处理特殊 HTTP 错误例如作为认证请求的时候,包含的属性 code 为 HTTP 的状态码, reason 为引发异常的原因,headers 为导致 HTTPError 的特定 HTTP 请求的 HTTP 响应头。) |
urllib.parse | 解析 URL |
urllib.robotparser | 解析 robots.txt 文件 |
urllib.request 方法
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 设置。)只能发送url,但不能发送headers。不能定制请求头。 |
---|---|
urllib.request.urlretrieve() | 请求网页,图片,视频 |
urllib.request.quote() | URL 的编码 |
urllib.request.unquote() | URL 的解码 |
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) | 模拟网页头部 headers信息。该方法用于创建请求对象、包装请求头,比如重构 User-Agent(即用户代理,指用户使用的浏览器)使程序更像人类的请求,而非机器。重构 User-Agent 是爬虫和反爬虫斗争的第一步。(url:url 地址。data:发送到服务器的其他数据对象,默认为 None。headers:HTTP 请求的头部信息,字典格式。origin_req_host:请求的主机地址,IP 或域名。unverifiable:很少用整个参数,用于设置网页是否需要验证,默认是False。method:请求方法, 如 GET、POST、DELETE、PUT等。)只能使用url,headers,data;但更高级的请求头handler(代理,动态cookie)就不可以使用了。 |
response = urllib.request.urlopen(“https://www.baidu.com/”)
- print(type(response)) # response的数据类型是HTTPResponse
- 字节(二进制)—>字符串 (解码decode)
- 字符串—>字节(二进制) (编码encode)
urllib.request.urlopen对象常见方法(html响应对象方法)
response.read() | 读取整个网页内容,返回的是一个二进制 bytes 的值。可以指定读取的长度:read(5)返回前5个字节 |
---|---|
response.read().decode() | decode()将字节串转换为 string 类型 |
response.readline() | 读取文件的一行内容 |
response.readlines() | 读取文件的全部内容。它会把读取的内容赋值给一个列表变量。 |
response.getcode() | 获取响应状态码。返回 200 说明网页正常,返回 404 说明网页不存在 |
response.status() | 获取响应状态码。 |
response.geturl() | 返回访问的目标的url地址 |
response.getheaders() | 获取响应头所有信息 |
response.getheader() | 获取响应头指定信息 |
urllib.parse方法
urllib.parse.urlencode(data) | 编码(post请求必须要进行编码) |
---|---|
urllib.parse.urlparse(urlstring, scheme=‘’, allow_fragments=True) | 解析 URL。(urlstring 为 字符串的 url 地址。scheme 为协议类型。allow_fragments 参数为 false,则无法识别片段标识符。相反,它们被解析为路径,参数或查询组件的一部分,并 fragment 在返回值中设置为空字符串。) |
urllib.parse.urlparse输出结果内容是一个元组,包含 6 个字符串:协议,位置,路径,参数,查询,判断。
ParseResult(scheme=‘https’, netloc=‘www.runoob.com’, path=‘/’, params=‘’, query=‘s=python+%E6%95%99%E7%A8%8B’, fragment=‘’)
get和post请求区别
get请求方式的参数必须编码,参数是拼接到url后面,编码之后不需要调用encode方法。
url = ‘url’
data = urllib.parse.urlencode(data)
url = url + data
headers = {“user-agent”: " ", ‘Cookie’: ’ '}
request = urllib.request.Request(url=url, headers=headers)
post请求方式的参数必须编码,参数是放在请求对象定制的方法中,编码后需要调用encode方法。
url = ‘url’
data = urllib.parse.urlencode(data).encode(‘utf-8’)
headers = {“user-agent”: " ", ‘Cookie’: ’ '}
request = urllib.request.Request(url=url, headers=headers, data=data)
response = urllib.request.urlopen(request)
content = response.read().decode(‘utf-8’)
总结:(1)已知url,data,headers。(2)求request。(3)解response。(4)答content。
post请求:
更新网页,打开开发者工具,点击Network,点击查看文件。
1.点击Headers,查看请求方式Request Method为POST。
2.观察Headers下的Form Data下的kw,即表单参数为输入的需求值
3.观察响应的数据Preview或Response下的值为输入需求结果的值
普通get和post请求 实例代码
import urllib.request
import urllib.parse
import json
'''
# get请求
url = 'https://www.baidu.com/s?' # 定义一个url(你要爬取的网址)
data = {
'wd':'猫'
} # 浏览器会自动编解码,而pycharm不会自动编解码。(注意:特殊字符也会被编码,故不要直接对url进行编码)
data = urllib.parse.urlencode(data) # 编码
url = url + data # 编码 --> https://www.baidu.com/s?wd=%E7%8C%AB
headers = {
"user-agent": "Mozilla/5.0 (Windows NT ####"
} # 添加请求头信息。一般保留user-agent和cookie
# 模拟浏览器向服务器发送请求,但有的网站会检测ua,如果你的请求中没有ua,则不会给你返回数据,因为urlopen方法中没有这个参数。
request = urllib.request.Request(url=url, headers=headers) # 创建Request对象的定制。即将资源路径、请求参数、请求头放在一起。
response = urllib.request.urlopen(request) # 模拟浏览器向服务器发送网络请求
content = response.read().decode('utf-8') # read()函数可以获取响应,但返回的响应格式是二进制的,需要解码。# 解码decode('编码格式') 编码格式在Response Headers,Content_Type里面查看
print(content)
# 总结:(1)已知url,data,headers。(2)求request。(3)解response。(4)答content。
'''
# post请求
# 更新网页,打开开发者工具,点击Network,查找Network下符合需求的空白文件(json文件),复制Headers下的内容
url = 'https://fanyi.baidu.com/v2transapi?from=en&to=zh' # 为General下的Request URL内容
data = {
'from': 'en',
'to': 'zh',
'query': 'cat',
'simple_means_flag': '3',
'sign': '661701.982004',
#token': '###',
'domain': 'common'
} # 为Form Data下的所有内容
data = urllib.parse.urlencode(data).encode('utf-8') # post请求必须要进行编码并且要进行encode方法的调用
headers = {
'Cookie': 'BIDUPSID=#####'
} # 为Request Headers下的内容,可依次注释掉查看哪些内容是需要留下的
request = urllib.request.Request(url=url, headers=headers, data=data) # 创建Request对象的定制。
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)
obj = json.loads(content) # 反序列化
s = json.dumps(obj, ensure_ascii=False) # 序列化
print(s)
'''
print(type(response)) # response是HTTPResponse的类型---》<class 'http.client.HTTPResponse'>
print(response.read(), response.read(5)) # 按照一个字节一个字节去读。# 读取具体的n个字节,在read()函数中传参即可
print(response.readline(), response.readlines()) # 按行读取,但是只能读取一行。# 按行读取,并且读取所有行
print(response.getcode(), response.status) # 返回状态码的方法--》200 200 (说明网页正常)
print(response.geturl()) # 返回访问的目标的url地址
print(response.getheaders(), response.getheader('Content-Type')) # 获取的是响应头所有信息。# 获取响应头指定信息
'''