Python爬虫框架scrapy入门使用记录

1、安装scrapy,pip install scrapy即可
2、新建项目scrapy startproject jdtu,类似django的新建项目方式,建好好目录层级如下

目录层级

ps:其中标红的是我们新建的文件
由于是框架,所以自带了很多的方法,封装了很多的功能,本次用到的只是最皮毛也最常用的部分,如抓取页面,查找标签,下载图片等。
3、新建项目之后如果是django项目是可以直接运行的,但是scrapy直接运行好像会报错,先动手代码吧,文件功能

Item.py--类似对抓取的一个实体(如图片的标题加url加注释)的定义
Middlewares.py--框架内部的东西,暂时没用到
Pipelines.py--框架核心功能之一,对抓取到的item通过管道传递给这个文件内的方法处理(如下载、保存、重命名等)
Settings.py--毫无悬念,总的配置文件,配置爬虫名、是否启用图片管道和文件管道等等
4、写代码之前首先要想好item中的内容
Item.py

    import scrapy
    class JdtuItem(scrapy.Item):
        title = scrapy.Field()
        image_urls = scrapy.Field()

Jdtu_spider.py(新建的爬虫主要文件)

    import scrapy
    from jdtu.items import JdtuItem
    from scrapy.selector import Selector
    
    # start_url中抓取当页二级网址列表,进入二级网址后是按页分隔的图册,所以写了两个Parsel方法进行抓取
    class JdTuSpider(scrapy.spiders.Spider):
        name = "jdtu"
        allowd_domains = ["jingdiantu.com"]
        start_urls = [
                    # "https://www.jingdiantu.com/list-性感美女.html",
                      "https://www.jingdiantu.com/list-网络美女.html",
                      "https://www.jingdiantu.com/list-丝袜美腿.html",
                      ]
    
        num = 1
        # 自定义抓取图册方法
        def MyParse1(self, response):
            item = JdtuItem()
            selector = Selector(response)
            base_url = "https://www.jingdiantu.com"
    
            item['title'] = selector.xpath('//p[@class="imgbox"]/img/@alt').extract()
            item['image_urls'] = selector.xpath('//p[@class="imgbox"]/img/@lazysrc').extract()
            yield item
            # 为避免抓取到下一篇的url直接进入下一个主题图册,添加flag_url以做区分
            next_site = selector.xpath('//div[@class="page"]//a[@class="current"]/following-sibling::a[1]/@href').extract()
            flag_site = selector.xpath('//div[@class="page"]//a[@class="current"]/following-sibling::a[2]/@href').extract()
            # 如果flag存在,说明next_site不是下一篇的URL
            if flag_site:
                yield scrapy.Request("https:" + next_site[0], callback=self.MyParse1)
        # 抓取start_url中本页左右图册URL
        def parse(self, response):
            item = JdtuItem()
            selector = Selector(response)
            base_url = "https://www.jingdiantu.com"
    
            sites = selector.xpath('//div[@class="piclist"]//li//a/@href').extract()
    
            for site in sites:
                site_url = "https:" + site
                yield scrapy.Request(site_url, callback=self.MyParse1)

Pipelines.py

    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.exceptions import DropItem
    from scrapy.pipelines.images import ImagesPipeline   #内置的图片管道
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    # from scrapy.pipelines.images import ImagesPipeline
    
    image_store = "/mnt/hgfs/images"
    
    class JdtuPipeline(object):
        def process_item(self, item, spider):
            return item
    
    # 自定义图片下载的管道方法,需settings文件中完成注册才会被使用
    class jdtuPipeline(ImagesPipeline):
        def get_media_requests(self, item, info):
            for image_url in item['image_urls']:
                image_url_f = "https:" + image_url
                # 通过meta将image_url和对应的其在列表中的index位置传递出去,可以在file_path方法中使用
                yield scrapy.Request(image_url_f, meta={'item':item,'index':item['image_urls'].index(image_url)})
        # 处理完item之后调用的方法
        def item_completed(self, results, item, info):
            image_paths = [x['path']for ok, x in results if ok]
            # print("image_path:%s"%image_paths)
            if not image_paths:
                raise DropItem("Item contains no images")
            return item
    
        # file_path方法返回图片保存地址,如full/image.jpg,如需修改保存图片名或增加分级目录可以重写该方法
        def file_path(self, request, response=None, info=None):
            item = request.meta['item']
            index = request.meta['index']
            # 通过get_media_requests方法的meta参数传递的数据可以获取到图片url的title等item自定义数据
            image_new = item['title'][index] + '/' + request.url.split('/')[-1]
            return image_new

Settings.py中需要新增的或修改的行

    # 告诉对方服务器我是浏览器,你别误会
    USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
    # 启用我们自己的管道方法
    ITEM_PIPELINES = {
       'jdtu.pipelines.jdtuPipeline': 1,
    }
    IMAGES_EXPIRES = 30
    IMAGES_STORE = '/mnt/hgfs/images'
    # 缩略图尺寸设置
    IMAGES_THUMBS = {
        'small': (35, 50),
        'big': (155, 200),
    }
    # 图片小于多少不下载
    IMAGES_MIN_HEIGHT = 80
    IMAGES_MIN_WIDTH = 80

到这里其实已经可以运行了。
5、运行项目
a、进入到创建的项目的一级目录,执行:scrapy crawl jdtu命令即可运行。scrapy框架本身会打印很多的日志出来,习惯就好、、(不想习惯的可以去改源码())。
只是这种方法很不人性化,又要死记,所以还有另一个更好的方法,见2
b、新建一个main.py文件(文件名随意的),注意目录层级文件位置,可参考上方截图,里面写如下代码
Main.py

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

之后我们只需要进入到main.py所在的目录执行python main.py即可运行项目。
方法b还有一个最大的好处就是方便IDE调试,如pycharm配置等

纯手写,边学边写,转载请注明出处:https://www.jianshu.com/p/ced81607f6c0

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容