Scrapy使用随机IP代理

第一步,先用不用代理的方式从西刺代理抓几个可用的IP,用Python的telnetlib库对其进行验证,将可用且速度够快的IP存入Redis和一个txt文件:

import redis
import telnetlib
import urllib.request
from bs4 import BeautifulSoup

r = redis.Redis(host='127.0.0.1',port=6379)

for d in range(1,3): #采集1到2页
    scrapeUrl = 'http://www.xicidaili.com/nn/%d/' %d
    req = urllib.request.Request(scrapeUrl)
    req.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')
    response = urllib.request.urlopen(req)  
    html = response.read()
        
    bsObj = BeautifulSoup(html, "html.parser")

    for i in range(100):
        speed = float(bsObj.select('td')[6 + i*10].div.get('title').replace('秒',''))
        if speed < 0.2: #验证速度,只要速度在0.2秒之内的
            ip = bsObj.select('td')[1 + i*10].get_text()
            port = bsObj.select('td')[2 + i*10].get_text()
            ip_address = 'http://' + ip + ':' + port
            try:
                telnetlib.Telnet(ip, port=port, timeout=2) #用telnet对ip进行验证
            except:
                print ('fail')
            else:
                print ('sucess:'+ ip_address)
                r.sadd('ippool',ip_address) #可用的ip导入到redis
                f = open('proxy_list.txt','a')
                f.write(ip_address + '\n') 
                f.close()

得到的可用IP如下:

http://112.81.143.245:8118
http://27.159.126.178:8118
http://117.68.167.215:8118
http://120.27.131.204:3128
http://114.115.216.99:80
http://117.78.37.198:8000
http://113.121.244.64:808
http://221.205.180.178:80
http://115.63.110.113:9999
http://27.40.132.250:808
http://113.91.65.133:8118
http://115.29.32.197:808
http://120.78.15.63:80

得到一个txt文件,proxy_list.txt

尝试之后发现,就算经过验证,筛选出来的IP可能还是无法使用。 用requests再验证下(用request是验证telnetlib),发现还是有的能用,有的不能用:

import requests

proxy = {'http':'120.27.131.204:3128'}
header = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
                      '(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
    }

url = 'http://ip.chinaz.com/getip.aspx/'
response = requests.get(url, proxies=proxy, headers=header)
response.encoding = 'utf-8'
print(response.text)

这个是可用的:

requests要更严格。 用requests方法取代第一步中的telnetlib:

import redis
import urllib.request
from bs4 import BeautifulSoup
import requests

r = redis.Redis(host='127.0.0.1',port=6379)
proxys = []
for d in range(1,3): #采集1到2页
    scrapeUrl = 'http://www.xicidaili.com/nn/%d/' %d
    req = urllib.request.Request(scrapeUrl)
    req.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')
    response = urllib.request.urlopen(req)  
    html = response.read()
        
    bsObj = BeautifulSoup(html, "html.parser")

    for i in range(100):
        speed = float(bsObj.select('td')[6 + i*10].div.get('title').replace('秒',''))
        if speed < 0.6: #验证速度,只要速度在0.6秒之内的
            ip = bsObj.select('td')[1 + i*10].get_text()
            port = bsObj.select('td')[2 + i*10].get_text()
            proxy_host = ip + ':' + port
            proxy_temp = {"http":proxy_host}
            proxys.append(proxy_temp)
    print(proxys)

for proxy in proxys:
    try:
        url = 'http://ip.chinaz.com/getip.aspx/'
        header = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
                          '(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
        }
        response = requests.get(url, proxies=proxy, headers=header, timeout = 3)
        code = requests.get(url, proxies=proxy, headers=header, timeout = 3).status_code
        if code == 200:
            print(code)
            response.encoding = 'utf-8'
            if "address" in response.text:
                print(response.text)
                r.sadd('ippool',proxy)
                f = open('proxy_list.txt','a')
                f.write(str(proxy) + '\n')
                f.close()
    except:
        print("失败")

从这两页只提取出两个IP:

{'http': '114.235.83.2:8118'}
{'http': '120.27.131.204:3128'}

再次验证,都成功了:

西刺代理高匿每页的数量是100,两页共200个,但是只筛选出两个满意的。注意一下筛选的参数(都是可修改的):速度小于0.6秒;requests的timeout为3秒。筛选粒度大一些的话,应该可以找到更多让人满意的。

(后来一次爬了10页,发现越到后面越没有可用的。只有第一页可用性最高。然而,即使是筛选出来的可用ip,再次验证还是会出错。看来只有以量取胜了。)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我的博客

logstash配置codec插件-JSON模式

配置nginx日志 log_format json '{"remote_addr":"$remote_addr" ,"host":"$host" ,"serve...

377100
来自专栏练小习的专栏

WP-pagenavi插件在分类内分页无效问题

一直用WP-pagenavi这个插件分页,今天突然遇到个大问题,我在首页调用一个分类 <?php query_posts('showposts=2&cat=5'...

21460
来自专栏Python中文社区

Python分布式爬虫详解(三)

上一章中,利用scrapy-redis做了一个简单的分布式爬虫,虽然很一般(只有30个请求)但是基本能说清楚原理,本章中,将对该项目进行升级,使其成为一个完整的...

22720
来自专栏iOSDevLog

Python 刷简书的浏览量 阅读数端午节快乐。熬夜看世界杯,先刷到 10k 吧。简易爬虫 common.py

280150
来自专栏编程微刊

表格插件-bootstrap table的分页使用示例

4:完整的添加数据之后显示在表格里面,自动分页代码,删除和编辑效果 jsp界面 :

52420
来自专栏FreeBuf

看我如何通过邮箱获取IP定位

还记得那些年,邮箱钓鱼盛行,各种广告邮件钓鱼邮件层出不穷,经过邮箱防水墙能拦截一部分以外,你是否注意到了正常邮箱可能被有心人利用的姿势?本文将用一个比较难以察觉...

69810
来自专栏iOSDevLog

简书浏览量

18850
来自专栏hbbliyong

Extjs 在项目中碰到问题

1.切换tabpanel,新建tab关闭后再新建报错,在火狐下报错 TypeError: el is null el.addCls.apply(el...

32580
来自专栏SeanCheney的专栏

Python模拟登陆 —— 征服验证码 6 126邮箱

登录之后,打印侧边栏。 ? 登录界面 import requests import re # 构造 Request headers agent = 'Moz...

34450
来自专栏拂晓风起

word 2007 不同章节插入不同样式的页码,不同的页眉

9820

扫码关注云+社区

领取腾讯云代金券