前面写过使用scrapy爬取快代理的免费ip
接下来使用的是基于Redis的分布式scrapy爬取快代理免费ip

1、准备好Redis

如何安装和使用Redis这里就不做介绍了,没有安装的可以参考我之前的博客。
注意:如果要在不同的机器上使用,要开启Redis的远程访问

2、创建好虚拟环境并在虚拟环境中安装好scrapy 和 scrapy-redis

pip install scrapy scrapy-redis

3、创建基础的scrapy工程

scrapy startproject kuaidaili_rediscd kuaidaili_redis/kuaidaili_redis# 创建普通的爬虫
scrapy genspider kuaidailispider "www.kuaidaili.com"
# 创建基于crawl spider的爬虫
scrapy genspider -t crawl kuaidailicrawlspider "www.kuaidaili.com"

4、开始改造scrapy成为scrapy-redis

(1)、修改settings.py
# -*- coding: utf-8 -*-
BOT_NAME = 'kuaidaili_redis'SPIDER_MODULES = ['kuaidaili_redis.spiders']
NEWSPIDER_MODULE = 'kuaidaili_redis.spiders'# 配置UA
USER_AGENT = 'Mozilla/5.0(Macintosh;IntelMacOSX10.6;rv:2.0.1)Gecko/20100101Firefox/4.0.1'# Obey robots.txt rules
# 是否遵循爬取规则,自己写的不需要遵循
ROBOTSTXT_OBEY = False# 指定使用scrapy-redis的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 指定使用scrapy-redis的去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"# 指定排序爬取地址时使用的队列,
# 默认的 按优先级排序(Scrapy默认),由sorted set实现的一种非FIFO、LIFO方式。
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue'
# 可选的 按先进先出排序(FIFO)
# SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderQueue'
# 可选的 按后进先出排序(LIFO)
# SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderStack'# 在redis中保持scrapy-redis用到的各个队列,从而允许暂停和暂停后恢复,也就是不清理redis queues
SCHEDULER_PERSIST = True# 只在使用SpiderQueue或者SpiderStack是有效的参数,指定爬虫关闭的最大间隔时间
# SCHEDULER_IDLE_BEFORE_CLOSE = 10# 配置管道
ITEM_PIPELINES = {# 默认的管道'kuaidaili_redis.pipelines.KuaidailiRedisPipeline': 300,# Redis的管道'scrapy_redis.pipelines.RedisPipeline': 400,
}# Introduce an artifical delay to make use of parallelism. to speed up the
# crawl. 人为延迟
DOWNLOAD_DELAY = 1# 指定redis数据库的连接参数
# REDIS_PASS是我自己加上的redis连接密码(默认不做)
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
#REDIS_PASS = 'redisP@ssw0rd'# LOG等级
LOG_LEVEL = 'DEBUG'#默认情况下,RFPDupeFilter只记录第一个重复请求。将DUPEFILTER_DEBUG设置为True会记录所有重复的请求。
DUPEFILTER_DEBUG =True# 存储数据库配置
DB_HOST = '127.0.0.1'
DB_PORT = 3306
DB_USER = 'root'
DB_PWD = 'root'
DB_NAME = 'kuaidaili_test'
DB_CHARSET = 'utf8'# Disable cookies (enabled by default)
#COOKIES_ENABLED = False# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False# 配置请求头
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
#   'Accept-Language': 'en',
}
(2)、修改items.py
# -*- coding: utf-8 -*-
import scrapyclass KuaidailiRedisItem(scrapy.Item):# 需要的数据现在这里制定好,因为在settings里面已近设置好了,所以可以和pipelines联系在一块处理数据# ip地址ip = scrapy.Field()# 端口port = scrapy.Field()# 爬取时间crawled = scrapy.Field()# 爬虫名spider = scrapy.Field() # 来源名# sourec = scrapy.Field()
(3)、修改pipelines.py
# -*- coding: utf-8 -*-
from datetime import datetime
import pymysql,jsonclass KuaidailiRedisPipeline(object):def process_item(self, item, spider):item["crawled"] = datetime.utcnow()item["spider"] = spider.namereturn item# 存入到mysql中的管道类,这个不在settings里面开启,就不会影响整个工程的运行
class MysqlPipeline(object):"""docstring for MysqlPipeline"""def __init__(self):settings = get_project_settings()self.host = settings['DB_HOST']self.port = settings['DB_PORT']self.user = settings['DB_USER']self.pwd = settings['DB_PWD']self.name = settings['DB_NAME']self.charset = settings['DB_CHARSET']# 链接数据库self.connect()def connect(self):self.conn = pymysql.connect(host=self.host,port=self.port,user=self.user,password=self.pwd,db=self.name,charset=self.charset)self.cursor = self.conn.cursor()def close_spider(self, spider):self.conn.close()self.cursor.close()def process_item(self, item, spider):# sql = 'insert into ip_list(ip, port) values("%s", "%s")' % (item['ip'], item['port'])# # 执行sql语句# self.cursor.execute(sql)# # 提交之后才会生效# self.conn.commit()return item
(4)、创建你的第一个scrapy-redis的spider 命名为myredisspider.py
# myredisspider.py
from scrapy_redis.spiders import RedisSpider
from kuaidaili_redis.items import KuaidailiRedisItemclass MyRedisSpider(RedisSpider):"""Spider that reads urls from redis queue (myspider:start_urls)."""name = 'myredisspider'# 注意这里原本应该是start_urls,但是使用redis后变成redis_keyredis_key = 'myredisspider:start_urls'# 这里本来应该是 allowed_domains = ['www.kuaidaili.com'] ,然后变成自动捕捉的,#值得注意的是这里使用allowed_domains = ['www.kuaidaili.com']仍然有效def __init__(self, *args, **kwargs):# Dynamically define the allowed domains list.domain = kwargs.pop('domain', '')self.allowed_domains = filter(None, domain.split(','))super(MyRedisSpider, self).__init__(*args, **kwargs)def parse(self, response):print('开始爬取...')ip_list = response.xpath('//tbody/tr/td[1]/text()').extract()port_list = response.xpath('//tbody/tr/td[2]/text()').extract()for i in range(len(ip_list)):item = KuaidailiRedisItem()item['ip'] = ip_list[i]item['port'] = port_list[i]yield item

到这一步来,一个简单的scrapy-redis分布式爬虫已经完成了,那么来运行一下看看吧
如何运行:使用scrapy-redis后的运行方式和原本的运行方式有一定的区别

# 在你的工程目录下
scrapy runspider spiders/myredisspider.py
# myredisspider.py 是你的爬虫文件名

运行之后就会发现,scrapy爬虫会暂定在redis的地方,它会等待redis里面接受的任务时开始正真的爬取。
打开你的Redis控制端
输入一下命令:

LPUSH myredisspider:start_urls https://www.kuaidaili.com/free/intr/
# 注意这里的key  myredisspider:start_urls  就是我们在myredisspider.py里面配置的redis_key

然后你就会可以看到scrapy-redis工作起来了,可以尝试在不同的机器上运行scrapy-redis,然后在redis内输入更多的地址,观察各个分布式爬虫是否都会工作起来

(5)、创建你的第一个基于RedisCrawlSpider的spider 命名为mycrawlredisspider.py
# mycrawlredisspider.py
from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor
from kuaidaili_redis.items import KuaidailiRedisItem
from scrapy_redis.spiders import RedisCrawlSpiderclass MyCrawlRedisSpider(RedisCrawlSpider):"""Spider that reads urls from redis queue (myspider:start_urls)."""name = 'mycrawlredisspider'redis_key = 'mycrawlredisspider:start_urls'allowed_domains = ['www.kuaidaili.com']links = LinkExtractor(restrict_xpaths=r'//div[@id="listnav"]//a')rules = (Rule(links, callback = "parse_test",follow=True),)def parse_test(self, response):print('开始爬取...')ip_list = response.xpath('//tbody/tr/td[1]/text()').extract()port_list = response.xpath('//tbody/tr/td[2]/text()').extract()for i in range(len(ip_list)):item = KuaidailiRedisItem()item['ip'] = ip_list[i]item['port'] = port_list[i]yield item

如何运行:基于RedisCrawlSpider的spider就更简单了,它会根据我们设置的规则找到基于爬取的url持续跟进爬取。
运行方式和myredisspider.py的运行方式一样。
当如果起始url后就会持续不断的爬取。

Scrapy-Redis 爬取快代理免费相关推荐

  1. 爬虫爬取快代理网站动态IP

    爬虫爬取快代理网站动态IP import requests, time from lxml import etree import time import randomcookie = "& ...

  2. 小白scrapy试炼-爬取慕课网免费课程

    本文参考博客: scrapy爬虫-爬取慕课网全部课程 scrapy爬虫框架入门实例 准备工作: anaconda(为了简单安装scrapy) 安装scrapy的方法有好多种,原来在pip上花了挺多时间 ...

  3. Python爬取快代理

    前天,本人在爬取某网站时,第一次遇到IP被封的情况,等了几个小时之后,还是不行.最后,迫于无奈,还是请出了大招,使用代理IP.今天,闲来无事,本人爬取了快代理网站上 5 万多条免费高匿名代理IP. 首 ...

  4. python爬取快代理IP并测试IP的可用性

    用到的网站https://www.kuaidaili.com/,免费的IP很不稳定,随时会挂,有需求的还是购买付费IP比较稳 import requests from urllib import pa ...

  5. Scrapy 框架爬取名言(scrapy中使用User-Agent和代理)

    使用Scrapy框架爬取名言 更 多 爬 虫 教 程 请 移 步 \color{red}更多爬虫教程请移步 更多爬虫教

  6. Scrapy简易爬取大众点评美食

    Scrapy简易爬取大众点评美食 最近快过五一了,对于部分人来说可定是旅游出去吃吃喝喝咯,那就来个爬取美食的吧,主要还是半个多月没写与工作无关的代码了,快生疏了,再不写写估计又还回去了 效果图 总共十 ...

  7. Scrapy框架爬取中国裁判文书网案件数据

    Scrapy框架爬取中国裁判文书网案件数据 项目Github地址: https://github.com/Henryhaohao/Wenshu_Spider 中国裁判文书网 - http://wens ...

  8. python ip动态代理_Python实现爬取可用代理IP

    Python实现爬取可用代理IP,在实现爬虫时,动态设置代理IP可以有效防止反爬虫,但对于普通爬虫初学者需要在代理网站上测试可用代理IP.由于手动测试过程相对比较繁琐,且重复无用过程故编写代码以实现动 ...

  9. 爬虫项目实战一:基于Scrapy+MongDB爬取并存储糗事百科用户信息

    爬虫项目实战一:基于Scrapy+MongDB爬取并存储糗事百科用户信息 一.前言 二.项目目标 三.项目的环境配置 四.项目实现 1. 创建QSBK项目 2. 实现Spider 1. 实现一页网页上 ...

最新文章

  1. 物理机_双机调试_资料
  2. Java位运算在程序设计中的使用:位掩码(BitMask)
  3. 一行命令搞定AD数据库备份
  4. 当当架构部张亮:从码农到大牛,技术与心境的双重提升
  5. Qt for Android / ios 将图片或文件打包进安装包中
  6. 网站服务器挂了导致排名下降,常见关键词排名消失的原因及解决对策
  7. Java面试必学-吐血推荐
  8. 软件测试之-测试用例写作规范
  9. 华为EMUI10的美学哲思:让美不止初见
  10. openwrt系统的无线WiFi配置文件
  11. 【尚未完成,不建议参考】马氏距离,汉明距离
  12. 在python中安装python库
  13. 【ABAP系列】SAP DOI技术中I_OI_SPREADSHEET接口的使用
  14. 数据结构课程设计-通讯录管理系统(C语言版)
  15. 移动端h5原生分享到朋友圈、微博等
  16. Fires Dynamics Simulator(FDS)软件运行代码说明
  17. target triplets
  18. 【python教程入门学习】第一个Pygame程序
  19. 一个很酷的在线生成漫画头像的网站
  20. 嵌入式Linux开发

热门文章

  1. 时隔一个月今日头条又宕机了 这个技术公司的“月经宕”有点频繁
  2. C++移动构造函数和移动赋值运算符
  3. https下不加www的强制跳转
  4. __gcd(x,y)函数 最大公约数
  5. 国耀明医互联网医院:人体必需营养素维持平衡是关键
  6. 访格兰特总统之墓与小男孩之墓
  7. USART1_IRQHandler 函数
  8. 开源扫描仪的工具箱:安全行业从业人员自研开源扫描器合集
  9. JAVA实现扫雷游戏
  10. 商汤科技自动驾驶研究员2019校招笔试第一题-跳台阶(每次可跳1~m级,跳到第n级的跳法总数)