Scrapy使用随机IP代理

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 第一步,先用不用代理的方式从西刺代理抓几个可用的IP,用Python的telnetlib库对其进行验证,将可用且速度够快的IP存入Redis和一个txt文件:import redisimport telnetlibimport urllib.

第一步,先用不用代理的方式从西刺代理抓几个可用的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

img_02ae7ec5cbff3efe9f126bdc9d07b7be.png

尝试之后发现,就算经过验证,筛选出来的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)

这个是可用的:


img_bbe6187fa371693818c96ccabad2ad17.png

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'}

再次验证,都成功了:

img_506ab3bc174e6104910fb879930d13cc.png

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

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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
数据采集 JavaScript 前端开发
动态内容抓取指南:使用Scrapy-Selenium和代理实现滚动抓取
在传统的网络爬虫中,静态网页内容很容易抓取,但对于通过JavaScript加载的动态内容,通常需要借助浏览器进行模拟访问。Scrapy-Selenium是一款结合了Scrapy和Selenium功能的库,可以实现模拟浏览器行为,从而实现抓取动态内容的目的。
288 0
动态内容抓取指南:使用Scrapy-Selenium和代理实现滚动抓取
|
数据采集 Python
使用 asyncio 提升 Scrapy 爬虫框架的异步编程效能,并集成代理功能
异步编程在现代软件开发中扮演着越来越重要的角色,特别是在网络爬虫等需要处理大量 I/O 操作的场景中。本文将介绍 asyncio 这个强大的异步编程库,并探讨如何在 Scrapy 爬虫框架中充分利用 asyncio 提升爬虫的效率和灵活性。此外,还将介绍如何集成爬虫代理功能,进一步提高爬虫的效率和稳定性。
253 0
使用 asyncio 提升 Scrapy 爬虫框架的异步编程效能,并集成代理功能
Python之scrapy的post请求、日志和代理
Python之scrapy的post请求、日志和代理
Python之scrapy的post请求、日志和代理
|
数据采集 JSON API
新手教程 | Python Scrapy框架HTTP代理的配置与调试
做过python爬虫的都知道,HTTP代理的设置时要在发送请求前设置好,那HTTP代理的逻辑点在哪里呢?实际上,只需要在Scrapy 的项目结构中添加就好
新手教程 | Python Scrapy框架HTTP代理的配置与调试
|
Python
Requests 和 Scrapy 添加动态IP代理
Requests 和 Scrapy 添加动态IP代理
358 0
|
Python
Scrapy添加代理验证
Scrapy添加代理验证
135 0
|
数据采集 中间件 Python
Python爬虫:scrapy-splash的请求头和代理参数设置
Python爬虫:scrapy-splash的请求头和代理参数设置
558 0
|
数据采集 NoSQL Redis
Scrapy使用代理爬取网站
timg.jpg 前言 在我们平时使用爬虫程序采集数据时,往往会遇到,因采集速度过快导致的自己网络ip被目标网站封禁,这种封禁有时候是封几分钟,有时候是封一天,封的时间不等,但是这样会导致我们局域网内其他人也无法访问目标网站,最大的问题是我们无法进行数据采集。
1713 0
|
Web App开发 Linux iOS开发
Scrapy随机切换用户代理User-Agent
使用fake-useragent:https://github.com/hellysmile/fake-useragent 这是一个可以随机切换访问头的插件 安装方法: pip install fake-useragent 使用方法: from fa...
1587 0
|
4月前
|
数据采集 中间件 Python
Scrapy爬虫:利用代理服务器爬取热门网站数据
Scrapy爬虫:利用代理服务器爬取热门网站数据