Requests 使用之代理

爬虫往往因为在短时间内对服务器发起调频请求,从而触发了服务器的防卫措施,导致发起请求的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)

在proxies中需要指定协议的类型,上面的实例中是https, 后面的值是对应的ip:端口

显然,只有一个代理ip是远远达不到目的,所以需要代理池:

 我们先购买代理:

然后通过爬虫到提取ip的网页将所有的ip爬取下来,将所有购买的代理放入列表中。

from lxml import etree
import random

# 将所有的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)

# 通过代理ip 访问目标服务器:
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 # 从代理ip中随机选择一个
    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))

一定要注意,参数名是proxies而不是Proxy

 

上一篇:Bs4 与xpath对比

下一篇:Requests 使用js混淆