Scrapy抓取免费ip代理地址的示例
Scrapy是一个用于爬取网站并提取结构化数据的应用程序框架,可用于各种有用的应用程序,例如数据挖掘,信息处理或历史档案。本文主要描述从某IP代理网站抓取内容的代码示例,免费代理IP时效性很差,仅供大家学习试用。
centos7安装Scrapy
pip install Scrapy
我本机安装时,不幸发生错误(Microsoft Visual C++ 14.0 is required),转而使用whl文件安装,下载地址【https://www.lfd.uci.edu/~gohlke/pythonlibs/】
分别下载Twisted和Scrapy,Twisted是依赖包,也需要安装。注意操作系统版本。
pip install Twisted-20.3.0-cp38-cp38-win_amd64.whl
pip install Scrapy-2.1.0-py3-none-any.whl
创建项目
scrapy startproject ipproxys
创建项目文件结构和主要文件的作用,如下:
scrapy.cfg :项目的配置文件
ipproxys/ :项目的Python模块
ipproxys/items.py :项目的目标文件,将抓取内容模型化
ipproxys/pipelines.py :项目的管道文件
ipproxys/settings.py :项目的设置文件
ipproxys/spiders/ :存储具体爬虫代码的目录
编写items.py代码
在items文件中增加目标网页对应的类,继承Item类,数据项是Field类型
class IpProxyItem(scrapy.Item):# define the fields for your item here like:ip = scrapy.Field()port = scrapy.Field()# 匿名度anons = scrapy.Field()# 类型:http/httpsschema = scrapy.Field()# 国家country = scrapy.Field()# 位置position = scrapy.Field()# 响应速度speed = scrapy.Field()# 最后验证时间verify_time = scrapy.Field()
编写爬虫代码
在spiders目录下,新建jiangxianli_spider.py并编写爬虫类文件,继承scrapy.Spider类,实现start_requests和parse两个方法。
class JxlIpSpider(scrapy.Spider):"""搜索免费代理IP地址"""# Spider 的标识符,用于唯一标识该 Spider;在整个项目中是全局唯一的name = "free_ip"def start_requests(self):"""必须定义并返回一组可以被 Spider 爬取的 Requests,Request 对象由一个 URL 和一个回调函数构成:return:"""urls = ['https://ip.jiangxianli.com/?page=1','https://ip.jiangxianli.com/?page=2'# 'https://www.kuaidaili.com/free' # 国内高匿IP]for url in urls:yield scrapy.Request(url=url, callback=self.parse)def parse(self, response):"""Request 对象中的回调方法,用来解析request返回的内容:param response::return:"""self.logger.info('正在爬取:< ' + response.request.url + ' >')# 按行读取数据tr_list = response.css("div.layui-form>table>tbody>tr")for tr in tr_list:# css的伪类 ::textip = tr.css('td:nth-child(1)::text').get()port = tr.css('td:nth-child(2)::text').get()anons = tr.css('td:nth-child(3)::text').get()schema = tr.css('td:nth-child(4)::text').get()position = tr.css('td:nth-child(5)::text').get()country = tr.css('td:nth-child(6)::text').get()# 7 运营商speed = tr.css('td:nth-child(8)::text').get()# 9 存活时间verify_time = tr.css('td:nth-child(10)::text').get()item = IpProxyItem()item['ip'] = ipitem['port'] = portitem['anons'] = anonsitem['schema'] = schemaitem['position'] = positionitem['country'] = countryitem['schema'] = schemaitem['speed'] = speeditem['verify_time'] = verify_timeprint(item)yield item
注意点:
- name :标识蜘蛛. 它在一个项目中必须是唯一的,也就是说,不能为不同的Spider设置相同的名称.
- start_requests() :必须返回一个可迭代的Requests(您可以返回请求列表或编写生成器函数),Spider将开始从中进行爬网. 随后的请求将从这些初始请求中依次生成.
- parse() :将被调用以处理为每个请求下载的响应的方法. response参数是TextResponse一个实例,该实例保存页面内容并具有其他有用的方法来处理它.
编写pipe保存数据
在piplelines.py文件中编写代码,将数据保存到redis库中。
同时,切记在配置文件中进行配置。
# 使用 connection pool 来管理对一个 redis server 的所有连接,避免每次建立、释放连接的开销
redis_pool = redis.ConnectionPool(host='192.168.xx.xx', port=6379, decode_responses=True, password='your password')
class IpProxyPipeline:def process_item(self, item, spider):self.save_redis(item)return itemdef save_redis(self, item):"""redis 提供两个类 Redis 和 StrictRedis, StrictRedis 用于实现大部分官方的命令,Redis 是 StrictRedis 的子类,用于向后兼用旧版本。redis 取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串:return:"""# 从连接池获取redis_server1 = redis.StrictRedis(connection_pool=redis_pool)# 直接创建连接# redis_server2 = redis.StrictRedis(host='192.168.xx.xx', port=6379, password='your password')# redis cache, push类似list.appendredis_server1.rpush('iplist', '{}://{}:{}'.format(item['schema'].lower(), item['ip'], item['port']))
配置pipe
# Configure item pipelines
ITEM_PIPELINES = {'ipproxys.pipelines.IpProxyPipeline': 300,
}
运行项目
按蜘蛛名称运行
scrapy crawl free_ip
也可以按文件运行:scrapy runspider <spider_file.py>
附录:试用代理
url = 'https://www.baidu.com'
# 从redis获取代理ip列表,循环试用
for i in range(redis_server1.llen('iplist')):ip_proxy = redis_server1.lindex('iplist', i)# 区分http和https,如果拆分为两个key,则更方便一些schame = 'http' if url.find(':') == 5 else 'https'if schame == ip_proxy[0:5]:proxies[schame] = ip_proxytry:# 超时分为连接超时和读取超时res = requests.get(url=url, proxies=proxies, timeout=(5, 20))if res.status_code == 200:print('ok')breakexcept Exception as ex:print(ex)
Scrapy抓取免费ip代理地址的示例相关推荐
- Python爬虫方式抓取免费http代理IP
我们新手在练手的时候,常常需要一些代理IP进行爬虫抓取,但是因为学习阶段,对IP质量要求不高,主要是弄懂原理,所以花钱购买爬虫代理IP就显得没必要(大款忽略),今天跟大家分享一下,如果使用爬虫抓取免费 ...
- python抓取免费ip存入redis
前言 网络爬虫在运行过程中并不顺利,总是会遇到各种各样的问题,如fan爬虫策略,它会试图阻止网络爬虫的运行,限制我们的的ip,所以说我们先需要在请求的时候加上代理ip,避免真实ip被封禁.在某代理批量 ...
- 用Python爬虫抓取免费代理IP
点击上方"程序员大咖",选择"置顶公众号" 关键时刻,第一时间送达! 不知道大家有没有遇到过"访问频率太高"这样的网站提示,我们需要等待一段 ...
- scrapy爬取免费代理IP存储到数据库构建自有IP池
以抓取西刺代理网站的高匿IP并存储到mysql数据库为例 西刺网:http://www.xicidaili.com/nn/ 运行环境:scrapy1.0.3 python2.7.10 需要安装MySQ ...
- 应对IP被封--抓取西刺代理,并构建自己的代理池
一.IP简介: 互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),缩写为IP地址(英语:IP Address),是分配给网络上使用网际协议(英语:Inte ...
- 逆向爬虫18 Scrapy抓取全站数据和Redis入门
逆向爬虫18 Scrapy抓取全站数据和Redis入门 一.全站数据抓取 1. 什么是抓取全站数据? 我们曾经在过猪八戒,图片之家,BOSS直聘等网站,利用网站官方提供的搜索功能,搜索指定关键词的内容 ...
- 免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作简易流量爬虫...
前言 我们之前的爬虫都是模拟成浏览器后直接爬取,并没有动态设置IP代理以及UserAgent标识,这样很容易被服务器封IP,因此需要设置IP代理,但又不想花钱买,网上有免费IP代理,但大多都数都是不可 ...
- 爬虫学习3.2 抓取西刺代理,并构建自己的代理池
任务描述 学习什么是IP,为什么会出现IP被封,如何应对IP被封的问题. 抓取西刺代理,并构建自己的代理池. 西刺直通点:https://www.xicidaili.com/ . 参考资料:https ...
- python scrapy 抓取脚本之家文章(scrapy 入门使用简介)
老早之前就听说过python的scrapy.这是一个分布式爬虫的框架,可以让你轻松写出高性能的分布式异步爬虫.使用框架的最大好处当然就是不同重复造轮子了,因为有很多东西框架当中都有了,直接拿过来使用就 ...
最新文章
- 设计模式之---Factory
- UA PHYS515A 电磁理论V 电磁波与辐射6 波导
- 【Python】表格文件处理
- 鸿蒙系统跟腾讯合作,要和华为鸿蒙竞争?腾讯系统开源了,仅1.8K,支持众多芯片 - 区块网...
- 多线程面试体系列(13):多线程同步内功心法——PV操作下
- 双向链表中基本函数的实现
- 操作给定的二叉树,将其变换为源二叉树的镜像。
- 【QT】入门基础教程Qt5
- Adreno GPU Profiler工具使用总结
- 干货|看怎么肢解堆垛机!
- const注意点(对象赋值)
- 微软正版验证_真正纯净无捆绑微软官方原版windows10安装教程无删减完整版
- 如何手动释放Python的内存
- 程序员数学(23)–图形的旋转与中心对称
- win10一直显示正在更新怎么关闭计算机,Win10自动更新关不掉?原来就少这么一步...
- iOS 15 新功能:即使手机关闭,也能找到丢失的iPhone
- android登录加密传输,android环境下两种md5加密方式(示例代码)
- 交叉表的概念及sql中交叉表的使用
- 2021年全球潜孔锤钻头收入大约1119.1百万美元,预计2028年达到1382.2百万美元
- kvm 1.创建虚拟机