scrapy框架-两种爬虫对比和大概流程

注:spider.py指使用命令行创建的爬虫主文件

1. 传统spider爬虫

创建scrapy项目,首先进入想创建项目的目录,然后cmd输入:

  1. scrapy startproject projectname # projectname 即是项目名
  2. cd projectname
  3. scrapy genspider spidername xxxx.com

spidername就是爬虫文件名 xxxx.com 用于限定爬虫爬取的范围爬虫名,其与项目名不能相同

为了方便运行,之间在project目录下创建start_project.py 来运行整个项目

  1. ~start_project.py
  2. from scrapy import cmdline
  3. cmdline.execute("scrapy crawl qsbk_spider".split())

简单两句话,要使用.split()是因为这里参数值接收列表,分裂之后恰好是列表,然后才能被执行。

回到spider.py(爬虫主要模块,用于解析),这里已经帮我们自动生成了一些参数,在parse函数中,response参数使用xpath语法,得到的是SelectorList类的对象(该类是scrapy框架定义的),然后可以使用for语句遍历其中,获得Selector类,还是可以使用xpath语法获取数据,这里由一个很方便的函数.get() 直接获取字符串,再使用.strip()可以直接获取没有空格换行等的文本。

  1. 示例代码
  2. def parse(self, response):
  3. contentLeft = response.xpath("//div[@class='col1']/div")
  4. for content in contentLeft:
  5. author = content.xpath(".//h2/text()").get().strip() # get 方法获取Selector中的第一个文本 返回str类型 getall方法获取Selector中的所有文本 返回一个列表
  6. joke = content.xpath(".//div[@class='content']/span/text()").get().strip()
  7. info = XXItem(author=author, joke=joke)
  8. yield info # 推送到piplines.py中进行下一步的数据存入操作

2. crawl型爬虫

在cmd中创建项目和爬虫

  1. scrapy startproject projectname
  2. cd projectname
  3. scrapy genspider -t crawl spidername "domain_name"

可见创建爬虫时便与传统spider不同,然后进入spider.py

  1. # 项目名为wxapp,爬虫名为wxapp_spider.py
  2. from scrapy.linkextractors import LinkExtractor
  3. from scrapy.spiders import CrawlSpider, Rule
  4. from wxapp.items import WxappItem # 导入items中定义好的数据类,方便json格式写入
  5. class WxappSpiderSpider(CrawlSpider):
  6. name = 'wxapp_spider'
  7. allowed_domains = ['wxapp-union.com']
  8. start_urls = ['http://www.wxapp-union.com/portal.php?mod=list&catid=2&page=1'] # 从第一页开始
  9. rules = (
  10. # Rule 1用于从开始页面向后面找到相同模式的url,所以follw选择True,
  11. Rule(LinkExtractor
  12. (allow=r'.+mod=list&catid=2&page=\d+'), follow=True),
  13. # Rule 2用于在Rule 1模式的页面下,找到真正需要解析数据的url,回调函数一定要改名字。
  14. Rule(LinkExtractor(allow=r'.+/article-.+\.html'), callback='parse_info', follow=False),)
  15. def parse_info(self, response):
  16. title = response.xpath(r"//h1[@class='ph']/text()").get() #获取标题
  17. author = response.xpath(r"//p[@class='authors']/a/text()").get() # 获取作者
  18. contents = response.xpath(r"//td[@id='article_content']//text()").getall()
  19. # 获取内容 因为td下面还有很多标签所以要用//text() 之后再.getall()
  20. content = ''.join(contents).strip()
  21. # 巧妙用法 join将列表中的每一项依次放入 加上.strp() 去掉多余的换行和空格
  22. info = WxappItem(title=title, author=author, content=content) #创建info对象
  23. yield info # 推送给pipelines.py

在多个规则下,一定要注意callback和follow参数,判断需要在新的页面中继续跟进符合正则的url。

比如获取职位简介列表的url就需要跟进,而职位的详情页面找到相同的url时不需要跟进,按照职位列表往下遍历即可。

所以,crawl型爬虫适合于整站爬取,传统spider型爬虫适合小规模爬取

crawl型爬虫参数讲解

  1. 另外需要使用 LinkExtractors链接提取器:
  2. class scrapy.linkextractors.LinkExtractor(
  3. allow = (),
  4. deny = (),
  5. allow_domains = (),
  6. deny_domains = (),
  7. deny_extensions = None,
  8. restrict_xpaths = (),
  9. tags = ('a','area'),
  10. attrs = ('href'),
  11. canonicalize = True,
  12. unique = True,
  13. process_value = None
  14. )
  15. 主要参数讲解:
  16. allow:允许的url。所有满足这个正则表达式的url都会被提取。
  17. deny:禁止的url。所有满足这个正则表达式的url都不会被提取。
  18. allow_domains:允许的域名。只有在这个里面指定的域名的url才会被提取。
  19. deny_domains:禁止的域名。所有在这个里面指定的域名的url都不会被提取。
  20. restrict_xpaths:严格的xpath。和allow共同过滤链接。
  21. Rule规则类:
  22. 定义爬虫的规则类。以下对这个类做一个简单的介绍:
  23. class scrapy.spiders.Rule(
  24. link_extractor,
  25. callback = None,
  26. cb_kwargs = None,
  27. follow = None,
  28. process_links = None,
  29. process_request = None
  30. )
  31. 主要参数讲解:
  32. link_extractor:一个LinkExtractor对象,用于定义爬取规则。
  33. callback:满足这个规则的url,应该要执行哪个回调函数。因为CrawlSpider使用了parse作为回调函数,因此不要覆盖parse作为回调函数自己的回调函数。
  34. follow:指定根据该规则从response中提取的链接是否需要跟进。
  35. process_links:从link_extractor中获取到链接后会传递给这个函数,用来过滤不需要爬取的链接。

3. 循环页面请求

  1. 找到循环条件和结束标准
  2. spider.py
  3. def parse(self, response):
  4. ...
  5. 设置好迭代退出的条件
  6. 使用yield scrapy.Request(url, callback=self.parse) 重复调用
  7. 示例:
  8. def parse(self, response):
  9. ..... # 解析数据的函数
  10. next_url = response.xpath("//ul[@class='pagination']/li[last()]/a/@href").get()
  11. if re.match(r'/\w*/\w*/\d*/', next_url) is None:
  12. return
  13. else:
  14. yield scrapy.Request(self.base_domain+next_url, callback=self.parse)
  15. # 这里 self.base_domain+next_url 就是下一个页面的url,之后回调函数使用它自己,到了最后一页处理完数据 达成if判断条件退出。这里用正则实际上由装逼的意思,判断一下长度就可以了

4. scrapy框架爬虫的大致流程

使用命令行创建爬虫项目

  1. >> scrapy startproject [projectname]
  2. >> cd [projectname]
  3. >> scrapy genspider -t crawl [爬虫名字] [域名] or scrapy genspider [爬虫名字] [域名]

使用IDE打开项目,并在projectname下创建start.py用于启动整个项目,注意scrapy框架只能这样启动。

  1. ~ start.py
  2. from scrapy import cmdline
  3. cmdline.execute('scrapy crawl [爬虫名字]'.split())

修改[spidername].py

按需求修改解析函数,如果是crawl型爬虫还需要修改和添加Rule

修改items.py

将需要的参数写好

  1. 示例:
  2. class xxItem(scrapy.Item):
  3. author = scrapy.Field()
  4. joke = scrapy.Field()

修改pipelines.py

pipelines.py主要用于按需求存储数据。

看需求是否修改或添加中间件---middlewares.py

最后按照需求修改settings.py

  1. settings.py
  2. 修改ROBOTSTXT_OBEY = False
  3. 打开headers DEFAULT_REQUEST_HEADERS 加入User-Agent Cookie
  4. 打开并修改piplines设置 ITEM_PIPELINES
  5. 打开延时 DOWNLOAD_DELAY
  6. 打开中间件 DOWNLOADER_MIDDLEWARES

实战代码可以看另一个笔记:scrapy框架-图片分类下载

爬虫2.1-scrapy框架-两种爬虫对比的更多相关文章

  1. Python爬虫进阶之Scrapy框架安装配置

    Python爬虫进阶之Scrapy框架安装配置 初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此 ...

  2. 第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码

    第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码 打码接口文件 # -*- coding: cp936 -*- import sys import os ...

  3. 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

    第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...

  4. 第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies

    第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于star ...

  5. 第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用

    第三百三十二节,web爬虫讲解2—Scrapy框架爬虫—Scrapy使用 xpath表达式 //x 表示向下查找n层指定标签,如://div 表示查找所有div标签 /x 表示向下查找一层指定的标签 ...

  6. 第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令

    第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令 Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --u ...

  7. scrapy爬虫提取网页链接的两种方法以及构造HtmlResponse对象的方式

    Response对象的几点说明: Response对象用来描述一个HTTP响应,Response只是一个基类,根据相应的不同有如下子类: TextResponse,HtmlResponse,XmlRe ...

  8. Python爬虫知识点四--scrapy框架

    一.scrapy结构数据 解释: 1.名词解析: o 引擎(Scrapy Engine)o 调度器(Scheduler)o 下载器(Downloader)o 蜘蛛(Spiders)o 项目管 ...

  9. 爬虫基础(五)-----scrapy框架简介

    ---------------------------------------------------摆脱穷人思维 <五> :拓展自己的视野,适当做一些眼前''无用''的事情,防止进入只关 ...

随机推荐

  1. NHibernate学习过程笔记

    NHbernate自动生成数据库的方法: using NHibernate; using NHibernate.Tool.hbm2ddl; namespace Test { public class ...

  2. C语言输入输出函数总结

    常见函数: FILE *p char ch char buf[max] fopen("filename","ab")//打开名为filename的文件并返回一个 ...

  3. mdev自动创建和删除设备节点

    设备节点的创建有二种方法: 1)手动创建:mknode命令  当insmod后,还需要手动moknod创建设备节点才能被应用层打开,并且使用完成之后还要删除节点. 2) 自动创建:mdev mdev, ...

  4. 转:system.Security.Cryptography C# 加密和解密

    以下文转自: http://www.360doc.com/content/13/0122/05/19147_261678471.shtml 总结:注册的时候经过MD5加密存进数据库,在登录的时候需要先 ...

  5. vsCode中误删了文件,教你怎么恢复

      不要慌!下面开始帮你找到,很简单!

  6. C++分享笔记:5X5单词字谜游戏设计

    笔者在大学二年级刚学完C++程序设计后,做过一次课程设计,题目是:5X5单词字谜游戏设计.为了设计算法并编写程序,笔者在当时颇费了一番心力,最后还是成功地完成了.设计中不乏有精妙之处.该程序设计完全是 ...

  7. ABAP术语-SAPNET

    SAPNET 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/17/1109823.html SAPNet is the intranet p ...

  8. cmd tab自动补全

  9. axios和ajax,fetch的区别

    1,传统 Ajax 指的是 XMLHttpRequest(XHR), 最早出现的发送后端请求技术,隶属于原始js中,核心使用XMLHttpRequest对象,多个请求之间如果有先后关系的话,就会出现回 ...

  10. HTML 5 audio标签

    audio标签的介绍 定义: <audio> 标签定义声音,比如音乐或其他音频流. <audio></audio>是HTML5中的新标签 能够在浏览器中播放音频, ...