分布式爬虫

分布式爬虫

scrapy_redis使用

dupefilter去重:

request_fingerpint() 请求指纹

使用haslib.sha1 对 request.method, request.url, request.headers, request.body 进行加密

40个字符的16进制字符串, 缺点太占内存

优化 :

将scrapy_redis中默认去重的dupefilter改为:

使用BloomFilter 去重, 内存小 ,比较快

1.在项目中使用以下设置:

#启用redis中的存储请求队列调度。
SCHEDULER =  scrapy_redis.scheduler.Scheduler

#确保所有蜘蛛通过redis共享相同的重复过滤器。
DUPEFILTER_CLASS =  scrapy_redis.dupefilter.RFPDupeFilter

#将请求的数据存储在redis中进行后期处理。
ITEM_PIPELINES = {
    ' scrapy_redis.pipelines.RedisPipeline '300
}

指定连接Redis时使用的主机和端口(可选)。
REDIS_HOST = 'localhost'
REDIS_PORT = 6379

具体用法参考链接 : https://github.com/rmax/scrapy-redis

2.使用

import scrapy
from scrapy_redis.spiders import RedisSpider  # 使用RedisSpider

from reading_network.items import ReadingNetworkItem

# 在basc模板的spider基础上作修改:
class GuoxueSpider(RedisSpider):  # 改为继承RedisSpider
   name = 'guoxue'
   redis_key = 'start_urls'  # 设置存放开始爬取地址的key key为start_urls, value为起始url

注意: 运行命令与之前不同, 命令:

cd spiders目录

scrapy runspider guoxue.py(爬虫文件)

 

3.数据持久化,存入mysql

import pymysql
from redis import Redis
import json

# 从redis中取出数据,然后储存到mysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='450502',
                      charset='utf8', database='spider1')
cursor = conn.cursor()
redis_conn = Redis()


def insert_mysql():
   while 1:
       # 从redis中取数据
       # print(redis_conn.brpop('guoxue:items', timeout=60))   # 取不到时会有60s的延时,超时后报错, (b'guoxue:items', b'{'name' : 'xxx'}')
       try:
           _, data = redis_conn.brpop('guoxue:items', timeout=60)
       except:
           cursor.close()
           conn.close()
           break

       # 转化为python对象
       data = json.loads(data, encoding='utf-8')
       keys = ', '.join(data.keys())
       values = ', '.join(['%s'] * len(data))  # '%s, %s, %s'
       sql = f'insert into guoxue({keys}) values({values})'
       try:
           cursor.execute(sql, tuple(data.values()))  # 传一个元组 替换 其中%s
           conn.commit()
       except Exception as e:
           print(e)
           conn.rollback()


if __name__ == '__main__':
   insert_mysql()

 

使用分布式

1.修改配置

  • window下需修改redis配置文件redis.windows.conf, 重启redis

    bind 127.0.0.1 改为 0.0.0.0

    protected-mode no # 关闭保护模式

    requirepass 123456 # 其他服务器远程访问需要带上密码

    • linux下redis修改配置文件redis.windows.conf, 重启redis

      bind 0.0.0.0

      requirepass 123456

      其他服务器连接本机redis: redis-cli -h 本机ip

      访问需输入密码: auth 123456

  • settings中需将共享redis数据库的服务器地址改为:

REDIS_URL = 'redis://:123456@本机ip:6379'  # 不是本地ip127.0.0.1

2.使用

和上面基本一样,只是使用crawlspider; 继承类改为 RedisCrawlSpider

import scrapy
from scrapy_redis.spiders import RedisCrawlSpider  # 使用RedisCrawlSpider

from reading_network.items import ReadingNetworkItem

# 在crawl模板的spider基础上作修改:
class GuoxueSpider(RedisCrawlSpider):  # 改为继承RedisCrawlSpider
   name = 'guoxue'
   redis_key = 'start_urls'  # 设置存放开始爬取地址的key key为start_urls, value为起始url

 

posted @ 2019-07-29 21:57  Deaseyy  阅读(206)  评论(0编辑  收藏  举报