scrapy框架之spider
爬取流程
Spider
类定义如何爬取指定的一个或多个网站,包括是否要跟进网页里的链接和如何提取网页内容中的数据。
爬取的过程是类似以下步骤的循环:
1.通过指定的初始URL初始化Request,并指定回调函数。当Request下载完后,生成Response作为参数传给回调函数。初始的Request是通过start_requests()读取start_urls中的URL来生成的,回调函数为parse()。
2.在回调函数中分析Response的内容,返回Item对象或者Request或包含二者的可迭代容器。返回Request对象经过Scrapy处理,下载相应的内容,并调用设置的回调函数。
3.在回调函数中,可以用选择器(或者Beautiful Soup,lxml这些解析器)来分析网页内容,生成Item。
4.生成的Item可以存入数据库,或存入到文件。
spider类
class scrapy.spiders.Spider:最简单的爬虫类。 方法与属性:
name:爬虫名,要唯一。
allowed_domains:允许爬取的域名列表。
start_urls:初始的URL列表。
custom_settings:参数配置字典,必须是类属性,因为参数配置在实例化前被更新。
crawler:此属性是由from_crawler()设置的。
settings:运行此爬虫的设置。
logger:Python的日志记录器,通过爬虫名创建。
from_crawler(crawler, *args, **kwargs):类方法,用于创建爬虫。crawler是Crawler的实例对象。
start_requests():当打开爬虫时调用此方法。会用初始URL列表创建Request。只调用一次。
parse(response):用于处理Response。
log(message[, level, component]):通过封装logger来发送日志消息。
closed(reason):爬虫关闭时调用此方法。
爬虫参数
爬虫可以接受参数来改变它的行为。这些参数一般用来定义初始URL,或者限定爬取网站的部分内容,也可以用来配置其它任何功能。
在运行crawl
命令时,通过-a
选项来传递参数(键值对):
scrapy crawl myspider -a category=electronics
然后可以在__init__()
初始化函数里获取参数,如:
class MySpider(scrapy.Spider):
name = 'myspider' def __init__(self, category=None, *args, **kwargs): # 直接作为一个函数参数
super(MySpider, self).__init__(*args, **kwargs)
self.start_urls = ['http://www.example.com/categories/%s' % category]
而默认的__init__()
函数会把这些参数定义为爬虫的属性,因此也可以这样用:
class MySpider(scrapy.Spider):
name = 'myspider' def start_requests(self):
yield scrapy.Request('http://www.example.com/categories/%s' % self.category) # 作为一个属性
# -*- coding: utf-8 -*-
import scrapy
from wangyiPro.items import WangyiproItem
from selenium import webdriver
class WangyiSpider(scrapy.Spider):
name = 'wangyi'
# allowed_domains = ['www.xxx.com']
start_urls = ['https://news.163.com/']
model_urls = [] #存放五大板块对应的url
def __init__(self):
self.bro = webdriver.Chrome(executable_path=r'C:\Users\lucky\Desktop\爬虫+数据\day07\chromedriver.exe') def parse(self, response):
#解析五个板块对应的页面连接
li_list = response.xpath('//*[@id="index2016_wrap"]/div[1]/div[2]/div[2]/div[2]/div[2]/div/ul/li')
indexs = [3,4,6,7,8]
for index in indexs:
li = li_list[index]
#每一个板块的url
model_url = li.xpath('./a/@href').extract_first()
self.model_urls.append(model_url)
#对每一个板块的url发起请求。注意:请求成功后获取的响应对象中存储的响应数据是不包含新闻标题数据(动态加载)
yield scrapy.Request(url=model_url,callback=self.parse_title) #是用来解析每一个板块页面中的新闻标题
def parse_title(self,response):
#response是不满足需求,因为该response中没有包含动态加载出来的新闻标题数据
div_list = response.xpath('/html/body/div/div[3]/div[4]/div[1]/div/div/ul/li/div/div')
for div in div_list:
new_title = div.xpath('.//div[@class="news_title"]/h3/a/text()').extract_first() item = WangyiproItem()
item['title'] = new_title detail_url= div.xpath('.//div[@class="news_title"]/h3/a/@href').extract_first()
#对新闻详情页发起请求,获取新闻内容
yield scrapy.Request(detail_url,callback=self.parse_detail,meta={'item':item}) #用来解析新闻详情页中的新闻内容(不是动态加载)
def parse_detail(self,response):
content = response.xpath('//*[@id="endText"]//text()').extract()
content = ''.join(content)
item = response.meta['item']
item['content'] = content yield item
#程序全部结束的时候被调用
def closed(self,spider):
print('结束爬虫!!!')
self.bro.quit()
案例演示
CrawlSpider类
创建crawlspider蜘蛛命令:
scrapy genspider -t crawl yangguang www.xxx.com
class scrapy.spiders.CrawlSpider:爬取一般网站的常用Spider。定义一些规则来跟进链接的方便机制。 方法和属性:
rules:包含一个或多个Rule对象的列表。如多个Rule匹配了相同链接,第一个被使用。
parse_start_url(response):当start_urls的请求返回时调用此方法。分析最初的返回值并返回Item对象或者Request或包含二者的可迭代容器。
爬取规则(Rule)
class scrapy.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None)
参数:
link_extractor:LinkExtractor对象,定义了如何从页面提取链接。
callback:可调用对象或字符串,如果是字符串,Spider中同名的函数被调用。从link_extractor中每次获取到链接时调用。接受的参数为Repsonse,返回Item对象或者Request或包含二者的可迭代容器。编写爬虫规则时,不要使用parse作为回调,因为CrawlSpider使用parse来实现逻辑,如果覆盖了parse,CrawlSpider会运行失败。
cb_kwargs:传递给回调函数的参数字典。
follow:布尔值,从Response提取的链接是否跟进。如果callback为None,follow默认为True,否则默认为False。
process_links:可调用对象或字符串,如果是字符串,Spider中同名的函数被调用。从link_extractor中获取链接列表时调用,主要用来过滤。
process_request:可调用对象或字符串,如果是字符串,Spider中同名的函数被调用。提取到每个Request时调用,返回Request或None,用来过滤Request。
CrawlSpider配合Rule的例子:
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor class MySpider(CrawlSpider):
name = 'example.com'
allowed_domains = ['example.com']
start_urls = ['http://www.example.com'] rules = (
# 提取匹配 'category.php',但不匹配'subsection.php'的链接,并跟进链接。
# 没有callback,意味着follow的默认值为True
Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))), # 提取匹配'item.php'的链接,并用parse_item这个方法来处理
Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'),
) def parse_item(self, response): # TODO
item = scrapy.Item()
return item
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from sunPro.items import SunproItem,SunProDetail # class SunSpider(CrawlSpider):
# name = 'sun'
# # allowed_domains = ['www.xxx.com']
# start_urls = ['http://wz.sun0769.com/index.php/question/questionType?type=4&page=']
# #连接提取器:
# #作用:就是根据指定的规则(allow:正则)进行连接的提取
# link = LinkExtractor(allow=r'type=4&page=\d+')
# rules = (
# #规则解析器
# #作用:负责对连接提取器提取到的连接所对应的页面源码数据进行指定规则(callback)的解析
# Rule(link, callback='parse_item', follow=True),
# #follow=True:将连接提取器 继续 作用到 连接提取器提取到的连接 所对应的页面源码中
# )
#
# def parse_item(self, response):
# print(response) #深度爬取
class SunSpider(CrawlSpider):
name = 'sun'
# allowed_domains = ['www.xxx.com']
start_urls = ['http://wz.sun0769.com/index.php/question/questionType?type=4&page=']
#连接提取器:
#作用:就是根据指定的规则(allow:正则)进行连接的提取
link = LinkExtractor(allow=r'type=4&page=\d+')
#使用另一个连接提取期去提取详情页的连接
link_detail = LinkExtractor(allow=r'question/\d+/\d+\.shtml')
rules = (
#规则解析器
#作用:负责对连接提取器提取到的连接所对应的页面源码数据进行指定规则(callback)的解析
Rule(link, callback='parse_item', follow=False),
#follow=True:将连接提取器 继续 作用到 连接提取器提取到的连接 所对应的页面源码中
Rule(link_detail,callback='parse_detail')
) def parse_item(self, response):
tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')
for tr in tr_list:
title = tr.xpath('./td[2]/a[2]/text()').extract_first()
num = tr.xpath('./td[1]/text()').extract_first()
item = SunproItem()
item['title'] = title
item['num'] = num yield item def parse_detail(self,response):
content = response.xpath('/html/body/div[9]/table[2]//tr[1]/td/div[2]/text()').extract_first()
num = response.xpath('/html/body/div[9]/table[1]//tr/td[2]/span[2]/text()').extract_first()
num = num.split(':')[-1] item = SunProDetail()
item['content'] = content
item['num'] = num yield item
案例演示
XMLFeedSpider类
class scrapy.spiders.XMLFeedSpider:通过迭代各个节点用于分析XML。迭代器可以从iternodes,xml和html中选择。而xml和html要先读取所有DOM,可能有性能问题,一般推荐使用iternodes。而html则能应对错误的XML。 方法和属性:
iterator:选用哪种迭代器,iternodes(默认),html,或xml。
itertag:开始迭代的节点名。
namespaces:(prefix, uri)形式的元组组成的列表。定义文档中会被处理的命名空间。register_namespace()被自动调用把prefix和uri生成命名空间。
adapt_response(response):在分析Response前被调用,可以用来修改内容,返回的也是一个Response。
parse_node(response, selector):当节点符合itertag时被调用。返回Item对象或者Request或包含二者的可迭代容器。
process_results(response, results):返回结果(Item或Request)时被调用。用于对结果作最后的处理。返回结果的列表(Item或Request)。
CSVFeedSpider类
class scrapy.spiders.CSVFeedSpider:与XMLFeedSpider相似,只是遍历的不是节点,而是行。 方法和属性:
delimiter:分隔符,默认为逗号。
quotechar:每个字段的特征,默认为双引号。
headers:用来提取字段的行的列表。
parse_row(response, row):row是一个字典,键为提供的或检测出来的header。可以覆盖adapt_response和process_results来进行前处理和后处理。
SitemapSpider类
class scrapy.spiders.SitemapSpider:通过Sitemaps来发现爬取的URL。支持嵌套的sitemap,并能从robots.txt中获取sitemap的URL。 方法和属性:
sitemap_urls:sitemap的URL列表,也可以是robots.txt。
sitemap_rules:(regex, callback)形式的元组列表。regex是匹配sitemap提供的URL的正则表达式。callback指定匹配后用于处理的函数。
sitemap_follow:用于匹配要跟进的sitemap的正则表达式的列表。默认情况所有sitemap都跟进。
sitemap_alternate_links:当一个URL有可选链接时,是否跟进。
sitemap_filter(entries):过滤函数,可以覆盖它来基于sitemap入口的属性来选择它们。
scrapy框架之spider的更多相关文章
- python爬虫入门(七)Scrapy框架之Spider类
Spider类 Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取的动作 ...
- Scrapy框架之Spider模板 转
一.安装scrapy 首先安装依赖库Twisted pip install (依赖库的路径) 在这个网址http://www.lfd.uci.edu/~gohlke/pythonlibs#twiste ...
- 爬虫(十六):Scrapy框架(三) Spider Middleware、Item Pipeline
1. Spider Middleware Spider Middleware是介入到Scrapy的Spider处理机制的钩子框架. 当Downloader生成Response之后,Response会被 ...
- python学习之-用scrapy框架来创建爬虫(spider)
scrapy简单说明 scrapy 为一个框架 框架和第三方库的区别: 库可以直接拿来就用, 框架是用来运行,自动帮助开发人员做很多的事,我们只需要填写逻辑就好 命令: 创建一个 项目 : cd 到需 ...
- Scrapy框架学习(三)Spider、Downloader Middleware、Spider Middleware、Item Pipeline的用法
Spider有以下属性: Spider属性 name 爬虫名称,定义Spider名字的字符串,必须是唯一的.常见的命名方法是以爬取网站的域名来命名,比如爬取baidu.com,那就将Spider的名字 ...
- 爬虫(十五):Scrapy框架(二) Selector、Spider、Downloader Middleware
1. Scrapy框架 1.1 Selector的用法 我们之前介绍了利用Beautiful Soup.正则表达式来提取网页数据,这确实非常方便.而Scrapy还提供了自己的数据提取方法,即Selec ...
- Python爬虫Scrapy框架入门(2)
本文是跟着大神博客,尝试从网站上爬一堆东西,一堆你懂得的东西 附上原创链接: http://www.cnblogs.com/qiyeboy/p/5428240.html 基本思路是,查看网页元素,填写 ...
- Python爬虫Scrapy框架入门(1)
也许是很少接触python的原因,我觉得是Scrapy框架和以往Java框架很不一样:它真的是个框架. 从表层来看,与Java框架引入jar包.配置xml或.property文件不同,Scrapy的模 ...
- Python爬虫从入门到放弃(十一)之 Scrapy框架整体的一个了解
这里是通过爬取伯乐在线的全部文章为例子,让自己先对scrapy进行一个整理的理解 该例子中的详细代码会放到我的github地址:https://github.com/pythonsite/spider ...
随机推荐
- docker系列之六容器数据卷
docker之容器数据卷 一.容器数据卷 docker容器运行的时候,会产生一系列的文件,那么我们希望容器产生的数据能提供给其他的容器使用,也就是说怎么实现容器间的数据的共享呢?这就需要用到我们所提到 ...
- java注解日志记录到数据库
1. pom添加依赖包 <!--添加aop依赖--><dependency> <groupId>org.springframework.boot</group ...
- [书籍翻译] 《JavaScript并发编程》 第二章 JavaScript运行模型
本文是我翻译<JavaScript Concurrency>书籍的第二章 JavaScript运行模型,该书主要以Promises.Generator.Web workers等技术来讲解J ...
- vmware 虚拟机扩展 liunx系统硬盘空间
参考一下以下博客 https://www.cnblogs.com/yongdaimi/p/9050155.html https://blog.csdn.net/daemon_2017/article/ ...
- svm 简单明了的入门级使用教程(转载)
如何使用libsvm进行分类 这帖子就是初步教教刚接触libsvm(svm)的同学如何利用libsvm进行分类预测,关于参数寻优的问题在这里姑且不谈,另有帖子详述. 其实使用libsvm进行分类很 ...
- (六)图数据neo4j之cypher(一)
1.Cypher概述 cypher是一种声明式的图数据库查询语言,能高效的查询和更新图数据库,是依赖于模式的.所谓模式(Patterns)是就是众多节点和关系的任意复杂想法. (1)节点语法 cyph ...
- Sliverlight/WPF 样式使用方法
1,UserControl 页面级样式: UserControl.Resources style setter Property value. TargetType为应用的类型 <UserCon ...
- Java学习第三天之注释
编写程序时,总需要为程序添加一些注释,用以说明某段代码的作用,或者说明某个类的用途.某个方法的功能,以及该方法的参数和返回值的数据类型及意义等. 一.为什么要添加注释? (1)便于自己理解:有些人可能 ...
- toolbox 中创建nginx服务器,使用localhost不能访问
使用toolbox 工具使用docker创建nginx 容器,使用localhost不能访问? 使用docker run --rm -d --name dweb -p 80:80 nginx 命令执 ...
- 如果将 macOS Mojave 降级为 macOS Sierra 或者更低版本
当前系统是10.14,我想装回10.11 办法: 1. 下载10.11, 我是从themacgo网站下载的 https://themacgo.com/macos-sierra-10-12-1-dmg- ...