专栏名称: 马哥Linux运维
马哥linux致力于linux运维培训,连续多年排名第一,订阅者可免费获得学习机会和相关Linux独家实战资料!
目录
相关文章推荐
运维  ·  谷歌云大规模宕机 ·  4 小时前  
51好读  ›  专栏  ›  马哥Linux运维

一篇文章搞定 Scrapy 爬虫框架

马哥Linux运维  · 公众号  · 运维  · 2019-12-27 21:00

正文

请到「今天看啥」查看全文


parse Parse URL (using its spider) and print the results runspider Run a self-contained spider (without creating a project) settings Get settings values shell Interactive scraping console startproject Create new project version Print Scrapy version view Open URL in browser, as seen by Scrapy


Scrapy开发


项目编写流程


  1. 创建项目

    使用 scrapy startproject proname 创建一个scrapy项目

    scrapy startproject [project_dir]

  2. 编写item

    在items.py中编写Item类,明确从response中提取的item

  3. 编写爬虫

    编写spiders/proname_spider.py,即爬取网站的spider并提取出item

  4. 编写item pipeline

    item的处理,可以存储


1 创建项目


1.1 豆瓣书评爬取


标签为“编程”,第一页、第二页链接:

https://book.douban.com/tag/%E7%BC%96%E7%A8%8B?start=0&type=T

https://book.douban.com/tag/%E7%BC%96%E7%A8%8B?start=20&type=T


随便找一个目录来创建项目,执行下面命令

$ scrapy startproject first .


会产生如下目录和文件


first ├─ scrapy.cfg └─ first   ├─ items.py   ├─ middlewares.py   ├─ pipelines.py   ├─ settings.py   ├─ __init__.py   └─ spiders     └─ __init__.py


  • first:

    外部的first目录是整个项目目录,内部的first目录是整个项目的全局目录

  • scrapy.cfg:

    必须有的重要的项目的配置文件

  • first 项目目录

  • __init__.py 必须有,包文件

  • items.py 定义Item类,从scrapy.Item继承,里面定义scrapy.Field类实例

  • pipelines.py 重要的是process_item()方法,处理item

  • settings.py:

    • BOT_NAME 爬虫名

    • ROBOTSTXT_OBEY = True 是否遵从robots协议

    • USER_AGENT = '' 指定爬取时使用

    • CONCURRENT_REQEUST = 16 默认16个并行

    • DOWNLOAD_DELAY = 3 下载延时,一般要设置,不宜过快发起连续请求

    • COOKIES_ENABLED = False 缺省是启用,一般需要登录时才需要开启cookie

    • SPIDER_MIDDLEWARES 爬虫中间件

    • DOWNLOADER_MIDDLEWARES 下载中间件

      • ' firstscrapy.pipelines.FirstscrapyPipeline': 300item交给哪一个管道处理,300 越小优先级越高

    • ITEM_PIPELINES 管道配置

      • ' fi rst.middlewares.FirstDownloaderMiddleware': 543543 越小优先级越高

  • spiders目录

    __init__.py 必须有,可以在这里写爬虫类,也可以写爬虫子模块


# first/settings.py参考BOT_NAME = 'first'SPIDER_MODULES = ['first.spiders']NEWSPIDER_MODULE = 'first.spiders'
USER_AGENT = "Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 3
# Disable cookies (enabled by default)COOKIES_ENABLED = False


注意一定要更改User-Agent,否则访问 https://book.douban.com/ 会返回403


2 编写Item


在items.py中编写


import scrapy
class BookItem(scrapy.Item): title = scrapy.Field() # 书名 rate = scrapy.Field() # 评分

3 编写爬虫


为爬取豆瓣书 评编写爬虫类,在spiders目录下:

  • 编写的爬虫类需要继承自scrapy.Spider,在这个类中定义爬虫名、爬取范围、其实地址等

    • 在scrapy.Spider中parse方法未实现,所以子类应该实现parse方法。 该方法传入response对象

# scrapy源码中class Spider():  def parse(self, response): # 解析返回的内容    raise NotImplementedError

爬取读书频道,tag为“编程”的书名和评分:

https://book.douban.com/tag/%E7%BC%96%E7%A8%8B?start=20&type=T


使用模板创建spider, $ scrapy genspider -t basic book douban.com


import scrapy
class BookSpider(scrapy.Spider): # BookSpider name = 'doubanbook' # 爬虫名,可修改,重要 allowed_domains = ['douban.com'






请到「今天看啥」查看全文