基于requests+redis的分布式爬虫

  简单的网络爬虫是对一个url进行请求,并等待其返回响应。在数据量小的情况下很实用,但是当你的数据量很大,显然分布式爬虫就更占优势!关于分布式,一般是使用一台主机(master)充当多个爬虫的共享redis队列,其他主机(slave)采用远程连接master,关于redis如何安装,这里不多做介绍!

  以爬虫伯乐在线的python文章为例,我的分布式爬虫由main01 main02 main03三个python文件构成,main01的主要任务是运行在master上,将文章的url爬取下来存入redis以供main02和main03读取解析数据。main01的主要代码如下:

# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup
import requests
from redis import Redis
from lxml import etree

r = Redis.from_url("redis://x.x.x.x:6379", decode_responses=True)

def get_urls(url="http://python.jobbole.com/all-posts/"):
    result = requests.get(url=url)
    selector = etree.HTML(result.text)
    links = selector.xpath(r‘//*[@id="archive"]/div/div[2]/p[1]/a[1]/@href‘)
    for link in links:
        r.sadd("first_urls", link)
    next_url = extract_next_url(result.text)
    if next_url:
        get_urls(next_url)

def extract_next_url(html):
    soup = BeautifulSoup(html, "lxml")
    next_url = soup.select(‘a[class="next page-numbers"]‘)
    for url in next_url:
        url = str(url)
    soup = BeautifulSoup(url, "lxml")
    next_url = soup.a["href"]
    return next_url

if __name__ == ‘__main__‘:
    get_urls()

  从本地连接master的redis可以看到,数据已经成功写入redis

  下面是main02的代码:

# -*- coding: utf-8 -*-

import json
import codecs
import requests
from redis import Redis
from lxml import etree
from settings import *
import MySQLdb

r = Redis.from_url(url=REDIS_URL, decode_responses=True)

def parse_urls():
    if "first_urls" in r.keys():
        while True:
            try:
                url = r.spop("first_urls")
                result = requests.get(url=url, timeout=10)
                selector = etree.HTML(result.text)
                title = selector.xpath(r‘//*[@class="entry-header"]/h1/text()‘)
                title = title[0] if title is not None else None
                author = selector.xpath(r‘//*[@class="copyright-area"]/a/text()‘)
                author = author[0] if author is not None else None
                items = dict(title=title, author=author, url=url)
                insert_mysql(items)
            except:
                if "first_urls" not in r.keys():
                    print("爬取结束,关闭爬虫!")
                    break
                else:
                    print("{}请求发送失败!".format(url))
                    continue
    else:
        parse_urls()

def insert_json(value):
    file = codecs.open("save.json", "a", encoding="utf-8")
    line = json.dumps(value, ensure_ascii=False) + "," + "\n"
    file.write(line)
    file.close()

def insert_mysql(value):
    conn = MySQLdb.connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DBNAME, charset="utf8", use_unicode=True)
    cursor = conn.cursor()
    insert_sql = ‘‘‘
        insert into article(title, author, url) VALUES (%s, %s, %s)
    ‘‘‘
    cursor.execute(insert_sql, (value["title"], value["author"], value["url"]))
    conn.commit()

if __name__ == ‘__main__‘:
    parse_urls()

  main02和main03(同main02的代码可以一样)可以运行在你的本地机器,在main02中我们会先判断master的redis中是否已经生成url,如果没有main02爬虫会等待,直到master的redis存在url,才会进行下面的解析!

  运行main02可以发现本地的mysql数据库中已经成功被写入数据!

以上就是一个简单的分布式爬虫,当然真正运行的时候,肯定是几个爬虫同时运行的,这里只是为了调试才先运行了main01!

  

原文地址:https://www.cnblogs.com/wwx394274/p/8119553.html

时间: 2024-08-04 20:49:39

基于requests+redis的分布式爬虫的相关文章

redis之分布式爬虫

分布式爬虫一般最少需要三台机器,一台为主服务器,用于生产爬虫任务,其它服务器用于消费爬虫任务. 准备爬取妹子图,主页地址 主服务器生产爬取任务 getUrlList.py #!/usr/bin/env python # _*_ coding:utf-8 _*_ __Author__ = 'KongZhaGen' import requests import bs4 import redis def creUrlList(): # 连接到redis服务器,需要密码 r = redis.Redis(

Redis实现分布式爬虫

redis分布式爬虫 概念:多台机器上可以执行同一个爬虫程序,实现网站数据的爬取 原生的scrapy是不可以实现分布式爬虫, 原因如下: 调度器无法共享 管道无法共享 scrapy-redis组件:专门为scrapy开发的一套组件. 该组件可以让scrapy实现分布式 pip install scrapy-redis 分布式爬取的流程: 1 redis配置文件的配置 将 bind 127.0.0.1 进行注释 将 protected-mode no 关闭保护模式 2 redis服务器的开启:基于

Scrapy框架之基于RedisSpider实现的分布式爬虫

需求:爬取的是基于文字的网易新闻数据(国内.国际.军事.航空). 基于Scrapy框架代码实现数据爬取后,再将当前项目修改为基于RedisSpider的分布式爬虫形式. 一.基于Scrapy框架数据爬取实现 1.项目和爬虫文件创建 $ scrapy startproject wangyiPro $ cd wangyiPro/ $ scrapy genspider wangyi news.163.com # 基于scrapy.Spider创建爬虫文件 2.爬虫文件编写--解析新闻首页获取四个板块的

基于Python使用scrapy-redis框架实现分布式爬虫 注

注:本文是在http://www.111cn.net/sys/CentOS/63645.htm,http://www.cnblogs.com/kylinlin/p/5198233.html的基础上加以改动的!版权归alex.shu,kylinlin所有. 1.首先介绍一下:scrapy-redis框架 scrapy-redis:一个三方的基于redis的分布式爬虫框架,配合scrapy使用,让爬虫具有了分布式爬取的功能.github地址: https://github.com/darkrho/s

【Scrapy框架基于scrapy-redis实现分布式爬虫】 򓮘

原文: http://blog.gqylpy.com/gqy/370 "Scrapy框架无法自己实现分布式,原因有二 多台机器上部署的Scrapy各自拥有各自的调度器,这样就使得多台机器无法分配 start_urls 列表中的url,即多台机器无法共享同一个调度器. 多台机器爬取到的数据无法通过同一个管道进行统一的持久化存储,即多台机器无法共享同一个管道. ___ 基于 scrapy-redis 组件的分布式爬虫 安装 :pip install scrapy-redis scrapy-redis

基于scrapy-redis两种形式的分布式爬虫

redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls列表中的url.(多台机器无法共享同一个调度器) 其二:多台机器爬取到的数据无法通过同一个管道对数据进行统一的数据持久出存储.(多台机器无法共享同一个管道) 2.基于scrapy-redis组件的分布式爬虫 - scrapy-redis组件中为我们封装好了可以被多台机器共享的调度器和管道,我们可以直

19.基于scrapy-redis两种形式的分布式爬虫

redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls列表中的url.(多台机器无法共享同一个调度器) 其二:多台机器爬取到的数据无法通过同一个管道对数据进行统一的数据持久出存储.(多台机器无法共享同一个管道) 2.基于scrapy-redis组件的分布式爬虫 - scrapy-redis组件中为我们封装好了可以被多台机器共享的调度器和管道,我们可以直

基于scrapy-redis的分布式爬虫

1.scrapy框架是否可以自己实现分布式? 答:不可以.原因有二: 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls列表中的url.(多台机器无法共享同一个调度器) 其二:多台机器爬取到的数据无法通过同一个管道对数据进行统一的数据持久出存储.(多台机器无法共享同一个管道) 2.基于scrapy-redis组件的分布式爬虫 - scrapy-redis组件中为我们封装好了可以被多台机器共享的调度器和管道,我们可以直接使用并实现分布式数据

17,基于scrapy-redis两种形式的分布式爬虫

redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls列表中的url.(多台机器无法共享同一个调度器) 其二:多台机器爬取到的数据无法通过同一个管道对数据进行统一的数据持久出存储.(多台机器无法共享同一个管道) 2.基于scrapy-redis组件的分布式爬虫 - scrapy-redis组件中为我们封装好了可以被多台机器共享的调度器和管道,我们可以直