Python-爬虫之requests
一、urllib返回的响应对象
print(type(response))
content = response.read()
content = response.read(6)
content = response.readlines().
content = response.readline()
print(response.getcode())
print(type(response.geturl()))
二、爬虫常见坑点处理
'''
url参数编码的问题:
-- 使用 url 请求数据时,可以携带参数
-- 但是参数中不可以有中文,如果有中文需要转化为 Unicode编码
'''
'''
UA(User-Agent)问题:
-- 中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA
-- 是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识
-- UA可以进行伪装
-- 如果需要频繁访问某个站点,建议多换几个UA使用
'''
'''
Cookie反扒
-- 访问个人主页,但是这是主页是需要登录之后才可以访问
-- 所以如果用爬虫访问该页面,访问的是登录界面,而不是主页
-- 此时就需要 cookie登录
-- 因为 cookie 中包含了访问页面时需要的数据,所有才可以访问成功
-- 我们可以先登录,找到登录后的 cookie,之后在进行爬取数据
'''
'''
报错:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte
原因:
服务端响应的数据是压缩后的版本
解决方法:
-- 方法1:
去掉请求头的一个参数对 "accept-encoding: gzip, deflate, br"
-- 方法2:
# (1) 将 数据转换成 流数据
buff = BytesIO(response.read())
# (2) 对流数据进行解压
f = gzip.GzipFile(fileobj=buff)
# (3) 读取流数据,并转换格式
content = f.read().decode('utf-8')
'''
'''
报错:
urlopen error [Errno 11001] getaddrinfo failed
原因:
不知,听说设计源码的问题
解决方法:
将 url 的单引号,改成双引号即可
'''
'''
报错:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 255: invalid start byte
原因:
中文字符的Unicode编码0x0800-0xFFFF之间,(utf-8包含了部分汉字)
当你试图将该“中文字符”转成U码的utf-8时超出了其范筹
而GBK 规范收录了 ISO 10646.1 中的全部 CJK 汉字和符号,并有所补充
解决方法:
将 `response.read().decode('utf-8')` 改为 `response.read().decode('gbk')`
'''
'''
报错:
'gb2312' codec can't encode character '\xa0' in position 2: illegal multibyte sequence
解决方法:
方法1.
-- 在转换前将 '\xa0' 替换掉
-- string.replace(u’\xa0’, u’ ‘);
方法2.
-- 在gbk解码时忽略掉不能解码的数据
-- fp.write(content.encode("gbk", 'ignore').decode("gbk", "ignore"))
原因:
gbk无法转换’\xa0’字符
说明是将Unicode字符编码为GBK时候出现问题,可能是本身Unicode类型的字符中,包含了一些无法转换为GBK编码的一些字符,此时出错的数据不多,忽略它即可
'''
三、通用的get请求
import urllib.parse
import urllib.request
try:
baseUrl = 'https://www.bilibili.com'
data = {
}
data = urllib.parse.urlencode(data)
url = baseUrl + data
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36',
}
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read()
content = content.decode('utf-8')
print(content)
with open('bi.html', 'w', encoding='utf-8') as fp:
fp.write(content)
except urllib.error.HTTPError:
print('HTTPError:错误!!!')
except urllib.error.URLError:
print('URLError:错误!!!')
四、通用的post请求
import json
import urllib.parse
import urllib.request
try:
baseUrl = 'https://fanyi.baidu.com/sug'
data = {
'kw': 'key',
}
data = urllib.parse.urlencode(data)
data = data.encode('utf-8')
headers = {
'Referer': 'https://fanyi.baidu.com/translate?aldtype=16047&query=&keyfrom=baidu&smartresult=dict&lang=auto2zh',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36',
}
request = urllib.request.Request(url=baseUrl, data=data, headers=headers)
response = urllib.request.urlopen(request)
content = response.read()
content = content.decode('utf-8')
with open('fanyi.json', 'w', encoding='utf-8') as fp:
fp.write(content)
with open('fanyi.json', 'r', encoding='utf-8') as fp:
data = json.load(fp)
print(data)
except urllib.error.HTTPError:
print('HTTPError:错误!!!')
except urllib.error.URLError:
print('URLError:错误!!!')
五、通用的get请求使用代理池
import urllib.parse
import urllib.request
from random import choice
try:
baseUrl = 'https://www.bilibili.com'
data = {
}
data = urllib.parse.urlencode(data)
url = baseUrl + data
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36',
}
request = urllib.request.Request(url=url, headers=headers)
proxise_pool = [
{'http': '47.242.66.236:4818'},
{'http': '47.242.190.60:11573'},
]
proxise = choice(proxise_pool)
handler = urllib.request.ProxyHandler(proxies=proxise)
opener = urllib.request.build_opener(handler)
response = opener.open(request)
content = response.read()
content = content.decode('utf-8')
print(content)
except urllib.error.HTTPError:
print('HTTPError:错误!!!')
except urllib.error.URLError:
print('URLError:错误!!!')
六、通用的post请求使用代理池
import json
import urllib.parse
import urllib.request
from random import choice
try:
baseUrl = 'https://fanyi.baidu.com/sug'
data = {
'kw': 'key',
}
data = urllib.parse.urlencode(data)
data = data.encode('utf-8')
headers = {
'Referer': 'https://fanyi.baidu.com/translate?aldtype=16047&query=&keyfrom=baidu&smartresult=dict&lang=auto2zh',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36',
}
request = urllib.request.Request(url=baseUrl, data=data, headers=headers)
proxise_pool = [
{'http': '47.242.66.236:4818'},
{'http': '47.242.190.60:11573'},
]
proxise = choice(proxise_pool)
handler = urllib.request.ProxyHandler(proxies=proxise)
opener = urllib.request.build_opener(handler)
response = opener.open(request)
content = response.read()
content = content.decode('utf-8')
with open('fanyi.json', 'w', encoding='utf-8') as fp:
fp.write(content)
with open('fanyi.json', 'r', encoding='utf-8') as fp:
data = json.load(fp)
print(data)
except urllib.error.HTTPError:
print('HTTPError:错误!!!')
except urllib.error.URLError:
print('URLError:错误!!!')
|