一个最简单的爬虫-调度程序

#调度程序
import html_downloader
import html_outputer
import html_parser
import url_manager



class SpiderMain(object):
    def __init__(self):
        """
        创建url管理器、HTML下载器、HTML解析器、HTML输出器
        """
        self.urls = url_manager.UrlManager()
        self.downloader = html_downloader.HtmlDownloader()
        self.parser = html_parser.HtmlParser()
        self.outputer = html_outputer.HtmlOutputer()

    def craw(self, root_url):
        """
        爬取数据逻辑
        """
        count = 1
        self.urls.add_new_url(root_url)     #在URL管理器中加入口URL
        while self.urls.has_new_url():      #只要URL管理器中有可以爬取的URL,就不断循环
            try:                            #将循环加入try模块,抛出异常
                """
                逻辑:从URL管理器中获取一个待爬取的URL,然后启动下载器下载这个页面,
                下载这个页面,我们调用解析器解析这个页面,得到新的URL列表和新的数据,
                对URL列表和数据分别处理,URL列表加入到URL管理器中,数据交给输出器收集
                """
                new_url = self.urls.get_new_url()
                print('craw %d : %s' % (count, new_url))
                html_cont = self.downloader.download(new_url)
                new_urls = self.parser.parse(new_url, html_cont)
                self.urls.add_new_urls(new_urls)
                new_data = self.parser.parse_data(new_url, html_cont)
                self.outputer.collect_data(new_data)
                if count == 100:
                    break
                count += 1
            except:
                print('Craw failed')
        self.outputer.output_html()



if __name__ =="__main__":
    root_url = "http://blog.csdn.net/sb_Ihateyou/article/list/"   #入口页
    obj_spider = SpiderMain()
    i = 1
    obj_spider.craw(root_url)
好的,这里是一个简单的CrawlSpider分布式爬虫程序的示例: 首先,我们需要安装Scrapy-Redis库,它是Scrapy的一个插件,可以实现分布式爬虫的功能。 ``` pip install scrapy-redis ``` 然后,我们需要在settings.py文件中进行一些配置: ``` # 启用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 ``` 接着,我们需要编写一个爬虫程序,这里以爬取豆瓣电影top250为例: ``` import scrapy from scrapy_redis.spiders import RedisCrawlSpider from scrapy.spiders import Rule from scrapy.linkextractors import LinkExtractor from myproject.items import MovieItem class DoubanMovieSpider(RedisCrawlSpider): name = 'douban_movie' redis_key = 'douban_movie:start_urls' allowed_domains = ['movie.douban.com'] start_urls = ['https://movie.douban.com/top250'] rules = ( Rule(LinkExtractor(allow=r'https://movie.douban.com/top250\?start=\d+'), follow=True), Rule(LinkExtractor(allow=r'https://movie.douban.com/subject/\d+/'), callback='parse_movie', follow=True), ) def parse_movie(self, response): item = MovieItem() # 使用XPath提取电影信息 item['title'] = response.xpath('//h1/span/text()').extract_first().strip() item['score'] = response.xpath('//strong/text()').extract_first().strip() item['director'] = response.xpath('//span[contains(text(), "导演")]/following-sibling::span[1]/a/text()').extract_first().strip() item['actors'] = response.xpath('//span[contains(text(), "主演")]/following-sibling::span[1]/a/text()').extract() item['category'] = response.xpath('//span[contains(text(), "类型")]/following-sibling::span[1]/text()').extract_first().strip() yield item ``` 这个爬虫程序继承了RedisCrawlSpider类,启用了Redis作为调度器和去重过滤器,并使用了LinkExtractor和Rule来定义爬取规则。在parse_movie方法中,我们使用XPath提取电影信息,并将结果保存到一个Item对象中。 最后,我们需要启动一个Redis服务,并在命令行中运行爬虫程序: ``` scrapy runspider douban_movie_spider.py ``` 这个命令会启动一个单机版的爬虫程序,如果需要进行分布式爬虫,我们可以使用scrapy-redis提供的命令来启动爬虫程序: ``` scrapy redis-spider douban_movie ``` 这个命令会将爬虫程序启动到Redis队列中,并在多个计算机或节点上同时运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值