代理池针对ip拦截破解

代理

  • 代理概念:代理服务器。
  • 作用:接受请求==》请求转发。
  • 代理和爬虫之间的关联:
    • 可以使用请求转发的机制使得目的服务器接收到的请求对应ip的一个改变。
  • 为什么要使用代理改变请求的ip地址?
    • 爬虫程序在短时间内对指定的服务器发起了一个高频的请求,则请求对应的ip可能会被目的服务器禁止。
  • 代理的一些基础知识:
    • 代理的匿名度:
      • 透明代理:目的服务器知道你使用了代理机制并且也知道你的真实IP
      • 匿名代理:知道使用了代理机制,但是不知道你的真实ip
      • 高匿代理:不知道使用了代理,也不知道你的真实ip
    • 代理的类型:
      • http
      • https
  • 免费代理ip:
    • 快代理
    • 西祠代理
    • www.goubanjia.com
    • 代理精灵

代理简述

代理服务器:实现请求转发,从而可以实现更换请求的ip地址
    在requests中如何将请求的ip进行更换

代理的匿名度:
    透明:服务器知道你使用了代理并且知道你的真实ip
    匿名:服务器知道你使用了代理,但是不知道你的真实ip
    高匿:服务器不知道你使用了代理,更不知道你的真实ip

代理的类型:
    http:该类型的代理只可以转发http协议的请求
    https:只可以转发https协议的请求

免费代理ip的网站
    快代理
    西祠代理
    goubanjia
    代理精灵(推荐):http://http.zhiliandaili.cn/

在爬虫中遇到ip被禁掉如何处理?
    使用代理
    构建一个代理池
    拨号服务器

简单入手

import requests
url = 'https://www.baidu.com/s?ie=utf-8&wd=ip'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
page_text = requests.get(url=url,headers=headers,proxies={'https':'112.195.96.115:32092'}).text
with open('./ip.html','w',encoding='utf-8') as fp:
    fp.write(page_text)
    
get/post方法中使用proxies请求代理的设置
proxies={'http':'ip:port'}

代理池

  • 对西祠代理发起一个高频的请求,使得本机ip被禁止,然后采用代理池解决代理的反爬
  • 代理池的构建:就是一个列表,列表中存储的是字典。每一个字典存储的键值

案例

对西祠代理发起一个高频的请求,使得本机ip被禁止,然后采用代理池解决代理的反爬

针对购买的代理 爬取 制作数据结构 成为代理池
all_ips = []#代理池
url = 'http://t.11jsq.com/index.php/api/entry?method=proxyServer.generate_api_url&packid=1&fa=0&fetch_key=&groupid=0&qty=30&time=1&pro=&city=&port=1&format=txt&ss=3&css=&dt=1&specialTxt=3&specialJson=&usertype=2'
page_text = requests.get(url,headers=headers).text
tree = etree.HTML(page_text)
ip_list = tree.xpath('//body//text()')[0].split('\n')
for ip in ip_list:
    dic = {
        'https':ip
    }
    all_ips.append(dic)
    
#利用上面生成的代理池 爬取其他网页
from lxml import etree
import random
url = 'https://www.xicidaili.com/nn/%d'
ips = []
for page in range(1,3):
    new_url = format(url%page)
    page_text = requests.get(new_url,headers=headers,proxies=random.choice(all_ips)).text
    tree = etree.HTML(page_text)
    #在xpath表达式中一定不可以出现tbody标签
    tr_list = tree.xpath('//*[@id="ip_list"]//tr')[1:]
    for tr in tr_list:
        ip = tr.xpath('./td[2]/text()')[0]
        ips.append(ip)
print(len(ips))
posted @ 2020-03-03 18:05  一起奥利给  阅读(392)  评论(0编辑  收藏  举报