目录
知识点回顾
urllib的底层原理与实现
具体详见:python爬虫基础---urllib的底层原理_我还可以熬_的博客-CSDN博客
代理ip
创建网络爬虫的第一原则:‘几乎一切都可以伪装!’
但是有一样东西不能作假,那就是你的IP地址。爬虫设置代理就是让别的服务器或电脑代替自己的服务器去获取数据。
避免ip被封杀
为防止网页被抓取的主要努力在识别人类与机器人的行为差异上。封杀ip这种行为,书本上理解为:农名不靠喷农药给庄稼杀虫,而是直接火烧农田彻底解决问题。
原理
在本地服务器和网络服务器之间加一个代理服务器。
分类
代理分类
透明代理:目标网站知道你使用了代理并且知道你的源IP地址,这种代理显然不符合我们这里使用代理的初衷
匿名代理:匿名程度比较低,也就是网站知道你使用了代理,但是并不知道你的源IP地址
高匿代理:这是最保险的方式,目标网站既不知道你使用的代理更不知道你的源IP
使用
导入proxyhandler和build_opener.
from urllib.request import Request,build_opener,ProxyHandler
创建一个handler对象为proxyhandler处理器,传入格式为({'http/https':ip地址 })
handler = ProxyHandler({'http':'183.236.232.160:8080'})
在构造一个opener就行了
opener = build_opener(handler)
完整代码如下:
from urllib.request import Request,build_opener,ProxyHandler
from fake_useragent import UserAgent
url = 'http://httpbin.org/get'
headers = {'User-Agent':UserAgent().chrome}
req =Request(url,headers=headers)
handler = ProxyHandler({'http':'183.236.232.160:8080'})
opener = build_opener(handler)
resp = opener.open(req)
print(resp.read().decode())
效果:
至于ip地址的寻找
这里用的是快代理里面的免费代理
网上大把代理网站,输入ip代理就能找到一大推。但是免费的终归是不稳定的,可以买一个ip地址,会有使用的方法
爬虫cookie
大多数现代网站都会用cookie跟踪用户是否已登录的状态信息。cookie为web开发者解决了大问题,但是给网络爬虫带来了问题。网络部分信息或APP的信息,若是想获取数据时,需要提前做一些操作,往往是需要登录,或者提前访问过某些页面才可以获取到!这就是因为底层在网页里面增加了cookie信息。
使用
直接将网页里的cookie信息复制过来,放入headers里边在用request进行封装。
header = {
'User-Agent':UserAgent().chrome,
'Cookie':'sid=1672925799964928; _gcl_au=1.1.418381206.1672925862; _ga=GA1.2.736668357.1672925863; channelid=bdtg_a13_a13a1; _gid=GA1.2.1888707180.1673231705; sessionid=796544bba96229a8d0120cb22eb85605; Hm_lvt_7ed65b1cc4b810e9fd37959c9bb51b31=1672925862,1673231706,1673254334,1673256395; Hm_lpvt_7ed65b1cc4b810e9fd37959c9bb51b31=1673256397'
}
req = Request(url,headers=header)
完整代码如下:
from urllib.request import Request,build_opener
from fake_useragent import UserAgent
url = 'https://www.kuaidaili.com/usercenter/overview'
header = {
'User-Agent':UserAgent().chrome,
'Cookie':'sid=1672925799964928; _gcl_au=1.1.418381206.1672925862; _ga=GA1.2.736668357.1672925863; channelid=bdtg_a13_a13a1; _gid=GA1.2.1888707180.1673231705; sessionid=796544bba96229a8d0120cb22eb85605; Hm_lvt_7ed65b1cc4b810e9fd37959c9bb51b31=1672925862,1673231706,1673254334,1673256395; Hm_lpvt_7ed65b1cc4b810e9fd37959c9bb51b31=1673256397'
}
req = Request(url,headers=header)
opener = build_opener()
resp = opener.open(req)
#获取请求数据
with open('tmp.html','wb') as f:
f.write(resp.read())
登录后保持cookie
为了保持Cookie不丢失可以urllib.request.HTTPCookieProcessor
来扩展opener的功能。
from urllib.request import Request,build_opener
from fake_useragent import UserAgent
from urllib.parse import urlencode
from urllib.request import HTTPCookieProcessor
login_url ='https://www.kuaidaili.com/login/'
args = {
'username':'用户名',
'passwd':'密码'
}
headers = {
'User-Agent':UserAgent().chrome
}
req = Request(login_url,headers= headers,data = urlencode(args).encode())
# 创建一个可以保存cookie的控制器对象
handler = HTTPCookieProcessor()
# 构造发送请求的对象
opener = build_opener(handler)
# 登录
resp = opener.open(req)
'''
-------------------------登录成功----------------------------------
'''
index_url ='https://www.kuaidaili.com/usercenter/overview'
index_req = Request(index_url,headers =headers)
index_resp = opener.open(index_req)
print(index_resp.read().decode())
爬虫保存与读取cookie
CookieJar
我们可以利用本模块的http.cookiejar.CookieJar
类的对象来捕获cookie并在后续连接请求时重新发送,比如可以实现模拟登录功能。该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
from urllib.request import Request,build_opener
from fake_useragent import UserAgent
from urllib.parse import urlencode
from urllib.request import HTTPCookieProcessor
from http.cookiejar import MozillaCookieJar
# 保存cookie
def save_cookie():
url ='https://www.kuaidaili.com/login/'
data = {
'login_type':'1',
'username':'用户名',
'passwd':'密码',
'next':'/'
}
headers = {
'User-Agent':UserAgent().chrome
}
req = Request(url,headers= headers,data = urlencode(data).encode())
# 创建一个可以保存cookie为文件的对象
cookie_jar = MozillaCookieJar()
# 创建一个可以保存cookie的控制器对象
handler = HTTPCookieProcessor(cookie_jar)
# 构造发送请求的对象
opener = build_opener(handler)
# 登录
resp = opener.open(req)
# 讲cookie的值保存成文件
cookie_jar.save('cookie.txt',ignore_discard=True,ignore_expires=True)
# 读取cookie
def use_cookie():
index_url ='https://www.kuaidaili.com/usercenter/overview'
headers = {
'User-Agent':UserAgent().chrome
}
index_req = Request(index_url,headers =headers)
cookie_jar = MozillaCookieJar()
# 读取文件
cookie_jar.load('cookie.txt',ignore_discard=True,ignore_expires=True)
handler = HTTPCookieProcessor(cookie_jar)
opener = build_opener(handler)
index_resp = opener.open(index_req)
with open('tmp.html','wb') as f:
f.write(index_resp.read())
if __name__ == '__main__':
#save_cookie()
use_cookie()
请求异常处理
错误类型
- 服务器错误
- 资源错误
- 请求超时
当服务器错误时,urlopen会抛出一个URLError异常。
from urllib.request import Request,urlopen
from fake_useragent import UserAgent
from urllib.error import URLError
url = 'http://www.sxtwerwf1jojhofsaf.cn/sadfa/sdfs14'
headers = {'User-Agent':UserAgent().chrome}
req = Request(url,headers = headers)
try:
resp = urlopen(req)
print(resp.read().decode())
except URLError as e:
# print(e)
if e.args:
print(e.args[0].errno)
else:
print(e.code)
print('爬取完成')
———————————————————————————————————