python爬虫基础---ip代理---cookie使用---请求异常处理

目录

知识点回顾

代理ip

避免ip被封杀

原理

分类 

代理分类

 使用

爬虫cookie

使用 

 登录后保持cookie

爬虫保存与读取cookie 

CookieJar

 请求异常处理


知识点回顾

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('爬取完成')

———————————————————————————————————

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我还可以熬_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值