精华内容
下载资源
问答
  • Scrapy 爬虫项目实战之分布式重构

    千次阅读 2018-12-07 19:56:15
    将已有的新浪分类资讯 Scrapy 爬虫项目,修改为基于 RedisSpider 类的 scrapy-redis 分布式爬虫项目 注:items 数据直接存储在 Redis 数据库中,这个功能已经由 scrapy-redis实现。除非单独做额外处理(如直接存...

    将已有的新浪分类资讯 Scrapy 爬虫项目,修改为基于 RedisSpider 类的 scrapy-redis 分布式爬虫项目


    注:items 数据直接存储在 Redis 数据库中,这个功能已经由 scrapy-redis实现。除非单独做额外处理(如直接存本地数据库等),否则不用编写pipelines.py 代码。

    settings.py 文件

    SPIDER_MODULES = ['Sina.spiders']
    NEWSPIDER_MODULE = 'Sina.spiders'
    USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    SCHEDULER_PERSIST = True
    SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
    #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
    #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
    ITEM_PIPELINES = {
    # 'Sina.pipelines.SinaPipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline': 400,
    }
    LOG_LEVEL = 'DEBUG'
    # Introduce an artifical delay to make use of parallelism. to speed
    up the
    # crawl.
    DOWNLOAD_DELAY = 1
    REDIS_HOST = "192.168.13.26"
    REDIS_PORT = 6379

    spider.py 文件

    # -*- coding: utf-8 -*-
    
    from  Sina.items import SinaItem
    import scrapy
    from scrapy_redis.spider import RedisSpider
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    
    class SinaSpider(RedisSpider):
        name = "sina"
        #allowed_domains = ["sina.com.cn"]
        redis_key = "sinaspider:start_urls"
        #start_urls = [
        #    "http://news.sina.cn/guide"
        #]
    
        def __init__(self, *args, **kwargs):
            domain = kwargs.pop('domian', '')
            self.allowed_domains = filter(None, domain.split(','))
            super(SinaSpider, self).__init__(*args, **kwargs)
    
    
        def parse(self, response):
            ''' 解析所有大类,小类URL和Title '''
            items = []
            parentUrls = response.xpath('//div[@id=\"tab01\"]/div/h3/a/@href').extract()
            parentTitle = response.xpath('//div[@id=\"tab01\"]/div/h3/a/text()').extract()
            subtUrls = response.xpath('//div[@id=\"tab01\"]/div/ul/li/a/@href').extract()
            subTitle = response.xpath('//div[@id=\"tab01\"]/div/ul/li/a/text()').extract()
    
            # 爬取所有大类
            for i in range(0, len(parentTitle)):
                # parentFilename = "./Data" + parentTitle[i]
                # if not os.path.exists(parentFilename):
                #     os.mkdirs(parentFilename)
            
            # 爬取所有小类
                for j in range(0, len(subtUrls)):
                    item = SinaItem()
    
                    # 保存大类URLS和Title
                    item['parentTitle'] = parentTitle[i]
                    item['parentUrls'] = parentUrls[i]
    
                # 检查小类是否以同类别大类 URL 开头,如果是则返回True
                if_belong = subtUrls[j].startwith(item['parentUrls'])
    
                # 如果属于大类,将存储目录放在该大类目录下
                if if_belong:
                    subFilename = parentFilename + '/' + subTitle[j]
                    if not os.path.exists(subFilename):
                        os.mkdir(subFilename)
                    
                    # 存储小类url,title,filename 字段数据
                    item['subUrls'] = subtUrls[j]
                    item['subTitle'] = subTitle[j]
                    item['subFilename'] = subFilename
    
                    items.append(item)
    
            # 发送每个小类子链接URL的Request,将得到的response和meta 数据一起交给回调函数detail_parse处理
            for item in items:
                yield scrapy.Request(url=item['subUrls'], meta={'meta_1':item}, callable=self.second_parse)
    
        # 对于返回小类的url 再次进行递归请求
        def second_parse(self, response):
            ''' 提取数据和所有小类子链接 '''
            meta_1 = response.meta['meta_1']
            sonUrls = response.xpath('//a/@href').extract()
    
            items = []
            for i in range(0, len(sonUrls)):
    
                # 检查每个链接是否以大类URL 开头,以HTML 结尾,如果是则返回True
                if_belong = sonUrls[i].endswith('.shtml') and sonUrls[i].startwith(meta_1['parentUrls'])
                
                # 如果属于大类,获取字段值放在同一个item 下方便传输
                if if_belong:
                    item = SinaItem()
                    item['parentTitle'] = meta_1['parentTitle']
                    item['parentUrls'] = meta_1['parentUrls']
                    item['subUrls'] = meta_1['subUrls']
                    item['subTitle'] = meta_1['subTitle'] 
                    item['subFilename'] = meta_1['subFilename']
                    item['sonUrls'] = sonUrls[i]
                    items.append(item)
    
            # 发送每个小类子链接URL的Request,将得到的response和meta 数据一起交给回调函数detail_parse 方法处理
            for item in items:
                yield scrapy.Request(url=item['sonUrls'], meta={'meta_2':item}, callable=self.detail_parse)
    
            def detail_parse(self, response): 
                ''' 解析获取文章标题和内容 '''
                item = response.meta['meta_2']
                content = ''
                head = response.xpath('//h1[@id=\"main_title\"].text()')
                content_list = response.xpath('//div[@id=\"artibody\"]/p/text()').extract()
    
                # 将 P 标签的文本内容合并到一起
                for content_1 in content_list:
                    content += content_1
    
                item['head'] = head[0] if len(head) > 0 else 'NULL'
                item['content'] = content
                yield item
                
    

    执行:

    Slave 端: scrapy runspider sina.py

    Master 端:redis-cli> lpush sinaspider:start_urls http://news.sina.com.cn/guide/

    展开全文
  • 需求: 要求:将所有对应的大类的标题和 urls、子类的标题和 urls、...import Scrapy import sys reload(sys) sys.setdefaultencoding("utf-8") class SinaItem(scrapy.Item): partenTitle =...

    需求:

    		获取所有对应的大类的标题和 urls、子类的标题和 urls、子链接 urls
    

    items.py

    # -*- coding: utf-8 -*-
    
    import Scrapy
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8") 
    
    class SinaItem(scrapy.Item):
        partenTitle = scrapy.Field()
        partenUrls = scrapy.Field()
        subTitle = scrapy.Field()
        subUrls = scrapy.Field()
        subFilename = scrapy.Field()
        sonUrls = scrapy.Field()
        head = scrapy.Field()
        content = scrapy.Field()
    

    pipelines.py

    # -*- coding: utf-8 -*-
    
    from scrapy import singals
    import sys
    
    class SinaPipeline(object):
        def process_item(self, item, spider):
            sonUrls = item['sonUrls']
            filename = sonUrls[7:-6].replace('/','_')
            filename += ".txt"
            fp = open(item['subFilename'] + '/' + filename, 'w')
            fp.write(item['content'])
            fp.close()
            return item
            
    
    

    settings.py

    # -*- coding: utf-8 -*-
    
    BOT_NAME = 'Sina'
    SPIDER_MODULES = ['Sina.spiders']
    NEWSPIDER_MOUDLE = 'Sina.spiders'
    
    ITEM_PIPELINES = {
        'Sina.pipelines.SinaPipeline': 500,
    }
    
    LOG_LEVEL = 'DEBUG'
    
    

    spiders.py

    # -*- coding: utf-8 -*-
    
    from  Sina.items import SinaItem
    import scrapy
    import os
    import sys
    
    class SinaSpider(scrapy.Spider):
        name = "sina"
        allowed_domains = ["sina.com.cn"]
        start_urls = [
            "http://news.sina.cn/guide"
        ]
    
        def parse(self, response):
            ''' 解析所有大类,小类URL和Title '''
            items = []
            parentUrls = response.xpath('//div[@id=\"tab01\"]/div/h3/a/@href').extract()
            parentTitle = response.xpath('//div[@id=\"tab01\"]/div/h3/a/text()').extract()
            subtUrls = response.xpath('//div[@id=\"tab01\"]/div/ul/li/a/@href').extract()
            subTitle = response.xpath('//div[@id=\"tab01\"]/div/ul/li/a/text()').extract()
    
            # 爬取所有大类
            for i in range(0, len(parentTitle)):
                parentFilename = "./Data" + parentTitle[i]
                if not os.path.exists(parentFilename):
                    os.mkdirs(parentFilename)
            
            # 爬取所有小类
            for j in range(0, len(subtUrls)):
                item = SinaItem()
    
                # 保存大类URLS和Title
                item['parentTitle'] = parentTitle[i]
                item['parentUrls'] = parentUrls[i]
    
            # 检查小类是否以同类别大类 URL 开头,如果是则返回True
            if_belong = subtUrls[j].startwith(item['parentUrls'])
    
            # 如果属于大类,将存储目录放在该大类目录下
            if if_belong:
                subFilename = parentFilename + '/' + subTitle[j]
                if not os.path.exists(subFilename):
                    os.mkdir(subFilename)
                
                # 存储小类url,title,filename 字段数据
                item['subUrls'] = subtUrls[j]
                item['subTitle'] = subTitle[j]
                item['subFilename'] = subFilename
    
                items.append(item)
    
            # 发送每个小类子链接URL的Request,将得到的response和meta 数据一起交给回调函数detail_parse处理
            for item in items:
                yield scrapy.Request(url=item['subUrls'], meta={'meta_1':item}, callable=self.second_parse)
    
        # 对于返回小类的url 再次进行递归请求
        def second_parse(self, response):
            ''' 提取数据和所有小类子链接 '''
            meta_1 = response.meta['meta_1']
            sonUrls = response.xpath('//a/@href').extract()
    
            items = []
            for i in range(0, len(sonUrls)):
    
                # 检查每个链接是否以大类URL 开头,以HTML 结尾,如果是则返回True
                if_belong = sonUrls[i].endswith('.shtml') and sonUrls[i].startwith(meta_1['parentUrls'])
                
                # 如果属于大类,获取字段值放在同一个item 下方便传输
                if if_belong:
                    item = SinaItem()
                    item['parentTitle'] = meta_1['parentTitle']
                    item['parentUrls'] = meta_1['parentUrls']
                    item['subUrls'] = meta_1['subUrls']
                    item['subTitle'] = meta_1['subTitle'] 
                    item['subFilename'] = meta_1['subFilename']
                    item['sonUrls'] = sonUrls[i]
                    items.append(item)
    
            # 发送每个小类子链接URL的Request,将得到的response和meta 数据一起交给回调函数detail_parse 方法处理
            for item in items:
                yield scrapy.Request(url=item['sonUrls'], meta={'meta_2':item}, callable=self.detail_parse)
    
            def detail_parse(self, response): 
                ''' 解析获取文章标题和内容 '''
                item = response.meta['meta_2']
                content = ''
                head = response.xpath('//h1[@id=\"main_title\"].text()')
                content_list = response.xpath('//div[@id=\"artibody\"]/p/text()').extract()
    
                # 将 P 标签的文本内容合并到一起
                for content_1 in content_list:
                    content += content_1
    
                item['head'] = head
                item['content'] = content
                yield item
                
    
    
    
        
    
    
    
            
    
    
    
    展开全文
  • 我之前的单位是国家互联网的新闻中心,做的项目中的有一项是复现863课题舆情监控系统中的内容,使用的方法是 Scrapy爬虫框架 结合 Django Web 搭建的数据采集系统,抓取的目标对象包括新闻、博客、论坛等等,其中...
  • 1、创建爬虫项目 在命令行输入: scrapy startproject xiaoshuo 2、创建自己的爬虫文件 scrapy genspider xiaoshuo zwdu.com 3、修改 start_urls = ['https://www.zwdu.com/book/7846/195393...

    爬取地址:https://www.zwdu.com/book/7846/195393.html

    1、创建爬虫项目
    在命令行输入:

    scrapy startproject xiaoshuo
    

    2、创建自己的爬虫文件

    scrapy genspider xiaoshuo zwdu.com
    

    3、修改

    start_urls = ['https://www.zwdu.com/book/7846/195393.html']
    

    4、修改settings

    USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763 '
    ROBOTSTXT_OBEY = False
    ITEM_PIPELINES = {
       'xiaoshuo.pipelines.XiaoshuoPipeline': 300,
    }#开启pipelines
    

    5、开始解析
    得到标题:
    在这里插入图片描述
    得到小说内容
    在这里插入图片描述
    得到下一章url
    在这里插入图片描述
    在这里插入图片描述
    代码如下:

        def parse(self, response):
            title = response.xpath('//h1/text()').extract_first()
            content = ''.join(response.xpath('//div[@id="content"]/text()').extract())  #得到列表所以变成字符串
            yield  {
                'title': title,
                'content': content
            }
            next_url = response.xpath('//div[@class="bottem2"]/a[3]/@href').extract_first()
            #base_url = 'https://www.zwdu.com/ book/7846/{}'.format(next_url)
            if next_url.find('.html') != -1:
                yield scrapy.Request(response.urljoin(next_url), callback=self.parse)#自动补齐前面的url
                #yield 推送到pipelines
    
    

    6、配置pipelines,将小说保存至文件中

    class XiaoshuoPipeline(object):
        def open_spider(self,spider):
            self.file = open('wldf.txt', 'w',encoding='utf-8')
        def process_item(self, item, spider):
            title = item['title']
            content = item['content']
            info = title + '\n' + content + '\n'
            self.file.write(info)
            self.file.flush()
            return item
        def close_spider(self,spider):
            self.file.close()
    

    7、新建main文件,启动爬虫
    在这里插入图片描述
    代码如下:

    from scrapy.cmdline import execute
    execute(['scrapy', 'crawl', 'zww'])
    
    展开全文
  • (浏览器解析网页的此处...1、创建爬虫项目 在当前终端下输入:scrapy startproject tupian 2、创建新的python文件,编写自己的爬虫 scrapy genspider zol desk.zol.com.cn 3、开启图片管道,修改settings文件 USE...

    爬取地址:http://desk.zol.com.cn/bizhi/8673_106969_2.html
    (浏览器解析网页的此处跳过了)
    1、创建爬虫项目
    在当前终端下输入:scrapy startproject tupian
    2、创建新的python文件,编写自己的爬虫

    scrapy genspider zol desk.zol.com.cn
    

    3、开启图片管道,修改settings文件

    USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763'
    
    	ROBOTSTXT_OBEY: False
    	ITEM_PIPELINES = {
        'tupian.pipelines.ImagePipline': 300,  #先用这个
    }
    
    
    IMAGES_STORE = 'E:/nginx-1.17.8/nginx-1.17.8/html/images' #这个是下载的图片保存位置,需要自己添加
    

    4、进入zol.py , 修改
    start_urls = ['http://desk.zol.com.cn/bizhi/8673_106969_2.html']
    5、根据xpath, 得到下一页的url和图片名,并通过yield推送到pipelines.py, 对最后一页进行判断。
    右键检查元素,定位到下一页
    在这里插入图片描述

    代码如下:

    
     def parse(self, response):
            image_urls = response.xpath('//img[@id="bigImg"]/@src').extract()
            image_name = response.xpath('string(//h3)').extract_first()
            yield{
                "image_urls": image_urls,
                "image_name": image_name
            }
            next_url = response.xpath('//a[@id="pageNext"]/@href').extract_first()
            if next_url.find('.html') != -1:
                yield scrapy.Request(response.urljoin(next_url), callback=self.parse)
    
    

    6、开始写pipelines.py
    新建一个类,继承自ImagesPipeline

    代码如下:

    class ImagePipline(ImagesPipeline):
        def get_media_requests(self, item, info):
            for image_url in item['image_urls']:
                yield scrapy.Request(image_url, meta={"image_name":item['image_name']})
        def file_path(self, request, response=None, info=None):
            file_name = request.meta['image_name'].strip().replace('\r\n\t\t','') + '.jpg' #替换掉不要的空格等字符
            return file_name.replace('/','_')   #注意/的意思,当前节点,会创建很多文件夹
    

    7、在tupian 中新建一个main文件,写入启动代码:

    from scrapy.cmdline import execute
    execute("scrapy crawl zol".split())
    
    

    8、启动main文件,抓取图片
    在这里插入图片描述

    展开全文
  • 初识Scrapy开发环境创建项目创建爬虫项目结构图创建Item分析HTML爬取网页开发环境运行平台:Windows 10Python版本:Python 3.6.1Scrapy版本:S...
  • Scrapy爬虫实战

    千次阅读 2017-06-07 22:53:33
    最近,想好好学习下Scrapy爬虫框架,一种很强大的 python 爬虫框架,在观看了极客学院的课程后,自己实现了用 Scrapy爬虫豆瓣电影 top250,并存于 mysql 数据库中。接下来就开始介绍实现过程。   首先来看看网页...
  • Python之Scrapy爬虫实战--新建scrapy项目

    千次阅读 2020-02-22 07:54:24
    C:\Users\chenmg>workon spider (spider) C:\Users\chenmg>cd C:\Users\chenmg\PycharmProjects\spider (spider) C:\Users\chenmg\PycharmProjects\spider&...scrapy startproject scrapy_test New Scrapy p...
  • scrapy爬虫实战

    千次阅读 2021-01-16 23:03:09
    前言 之前课内项目使用bs4和request来做...接着创建爬虫项目 $ scrapy startproject kaggle 然后创建你的爬虫 $ cd kaggle $ scrapy genspider spider_name domain 这下就生成了一个名为spider_name,并且限定在d
  • 创建爬虫 项目结构图 创建Item 分析HTML 爬取网页 开发环境 运行平台:Windows 10 Python版本:Python 3.6.1 Scrapy版本:Scrapy 1.4.0 IDE:Sublime text3 浏览器:chrome 下面我们进入本文的主题,爬取我们的第一...
  • 开始上代码: 开启新的爬虫项目scrapy startproject mongo_demo 创建自己的爬虫文件 douban.py scrapy genspider douban movie.douban.com 启动文件start.py from scrapy.cmdline import execute execute(...
  • Python-Scrapy 入门级爬虫项目实战 糗事百科段子爬取
  • 开发环境 Python第三方库:lxml、Twisted、pywin32、scrapy Python 版本:python-3.5.0-amd64 PyCharm软件版本:pycharm-professional-2016.1...1 知识点:scrapy 爬虫项目的创建及爬虫的创建1.1 scrapy 爬虫项目的创建
  • 不会的同学可参考我的另一篇博文,这里不再赘述:Python之Scrapy爬虫实战–新建scrapy项目 这里只讲一下几个关键点,完整代码在文末。 由于爬取的网站有反爬,一开始没绕过反爬,debug几下代码就被封了ip(我只是在...
  • 一、scrapy爬虫实战项目要求——爬取京东男装商品信息 1.工具:使用scrapycrawl爬虫模板 2.内容:爬取商品名称、商家名称、评分、价格(对应每一种颜色和尺码,数量=1时的价格)、多张图片 3.提示:容易被封ip,...
  • 原博文链接:...Python第三方库:lxml、Twisted、pywin32、scrapy Python 版本:python-3.5.0-amd64 PyCharm软件版本:pycharm-
  • Scrapy 爬虫项目设置防反爬

    千次阅读 2017-06-16 17:08:27
    所有的设置都是在scrapy爬虫项目中的settings.py 文件中进行设置。 Step 1 . 设置爬虫不遵循 robots.txt协议详细内容请跳转–原文链接第22行: ROBOTSTXT_OBEY = FalseStep 2 . 设置取消Cookies第36行: COOKIES_...
  • 4.新建scrapy爬虫的大致思想 5.补充(安装scrapy) 二、开始第一个项目 1.新建项目 2.明确目标(item) 3.制作爬虫(spider) 4.编辑管道文件(pipelines.py) 5.保存数据 一、认识scrapy 1.简介 scrapy是一个为...
  • Python——Scrapy爬虫实战项目

    千次阅读 2019-09-08 20:22:28
    步骤一:在cmd下创建项目 >> scrapy startproject NewVideoMovie >> cd NewVideoMovie >> scrapy genspider spider http://www.yy6080.cn/vodtypehtml/1.html 创建结果: 步骤二:编辑主程序 # -...
  • Scrapy爬虫实战+Mysql

    2019-09-02 13:05:18
    本次爬取的网址为:...首先在启动命令行,创建爬虫项目: scrapy startproject NewVideoMovie 然后: cd NewVideoMovie 最后创建spider: scrapy genspider spider http://www.yy6080.cn/vod...
  • 引言:Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试...2.2 创建Scrapy项目 $ scrapy startproj...
  • Scrapy爬虫实战:百度搜索找到自己

    千次阅读 2018-12-05 17:51:53
    Scrapy爬虫实战:百度搜索找到自己背景分析怎么才算找到了自己怎么才能拿到百度搜索标题怎么爬取更多页面baidu_search.py声明BaiDuSearchItemItemsitems.pyItem Pipelinepipelines.py配置Pipelinesettings.py运行...
  • 第一个Scrapy爬虫 在第一章中,我们通过genspider命令在spiders文件夹中生成了一个名为quote的爬虫。这本章,笔者将带大家了解quote.py的内容并编写出第一个具有特定功能的Scrapy爬虫。 1. 初始代码解释 以下...
  • Python+Scrapy爬虫实战

    2020-05-27 11:38:10
    目录欢迎使用Markdown编辑器 首先说下本实例的一个大致需求与思路: 需求:需要从一个网址上爬取所有的下载文件,该网址还有很多的子目录,子目录下的...Scrapy是一个功能强大的爬虫框架 欢迎使用Markdown编辑器 ...
  • 006:开启Scrapy爬虫项目之旅

    千次阅读 多人点赞 2019-01-23 22:59:09
    本章将从实战编写来补充scrapy的基础知识 Items的编写: 使用Scrapy中的Item对象可以保存爬取到的数据,相当于存储爬取到数据的容器。 我们可以定义自己所关注的结构化信息,然后从庞大的互联网信息体系中提取出...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,647
精华内容 1,858
关键字:

scrapy爬虫项目实战

爬虫 订阅