python - 爬虫之urllib模块一览总表

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.观察响应的数据PreviewResponse下的值为输入需求结果的值

普通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'))    # 获取的是响应头所有信息。# 获取响应头指定信息
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值