scrapy
Scrapy的请求是异步调度和处理的。这意味着Scrapy不需要等待请求完成和处理,它可以在此期间发送另一个请求或执行其他操作。这也意味着即使某些请求失败或在处理错误时发生错误,其他请求也可以继续运行。
Scrapy是用纯Python编写的,取决于一些关键的Python包(以及其他):
lxml,一个高效的XML和HTML解析器
parsel,一个在lxml之上编写的HTML / XML数据提取库,
w3lib,一个用于处理URL和网页编码的多用途帮助程序
twisted,一个异步网络框架
cryptography和pyOpenSSL,用于处理各种网络级安全需求
scrapy.cfg文件所在的目录称为项目根目录
Scrapy 工程结构
tutorial/
scrapy.cfg # deploy configuration file
tutorial/ # project's Python module, you'll import your code from here
__init__.py
items.py # project items definition file
middlewares.py # project middlewares file
pipelines.py # project pipelines file
settings.py # project settings file
spiders/ # a directory where you'll later put your spiders
__init__.py
直接在终端运行
scrapy shell "http://quotes.toscrape.com/page/1/".会像该Url request
response.css('title') # 返回一selectorList
抽取text
response.css('title::text').extract()
response.css('title::text').extract_first()
response.css('title::text').re(r'Quotes.*')
view(response)#打开响应页面
Selector Gadget也是一个很好的工具,可以快速找到视觉选择元素的CSS选择器,它可以在许多浏览器中使用。
除了CSS,Scrapy selectors也支持XPath扩展。XPath表达式非常强大,是Scrapy Selectors的基础。实际上,CSS选择器在底层下转换为XPath
response.xpath('//title/text()').extract_first()
scrapy crawl quotes -o quotes.json //运行该脚本,并把结果保存到json文件里头
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/',
]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').extract_first(),
'author': quote.css('span small::text').extract_first(),
'tags': quote.css('div.tags a.tag::text').extract(),
}
next_page = response.css('li.next a::attr(href)').extract_first()
if next_page is not None:
yield response.follow(next_page, callback=self.parse)
response.follow supports relative URLs directly - no need to call urljoin.
默认情况下,Scrapy会筛选出已访问过的URL的重复请求,从而避免因编程错误而导致服务器过多的问题。这可以通过设置进行配置 DUPEFILTER_CLASS
通过-a选项,我们可以把参数传递给Scrapy
scrapy crawl quotes -o quotes-humor.json -a tag=humor
Command line tool
有两种命令,一种只能在Scrapy项目内部工作(特定于项目的命令)和那些在没有活动的Scrapy项目(全局命令)的情况下工作的命令,尽管从项目内部运行时它们可能表现略有不同(因为他们会使用项目覆盖设置)。
Global commands:
startproject
genspider
settings
runspider
shell
fetch
view
version
Project-only commands:
crawl
check
list
edit
parse
bench
一个项目有多个spider,
使用该scrapy工具做的第一件事是创建Scrapy项目:
scrapy startproject myproject [project_dir] 这将在project_dir目录下创建一个Scrapy项目。如果project_dir没有指定,project_dir将是相同的myproject
scrapy genspider [-t template]
scrapy genspider -t crawl scrapyorg scrapy.org ,Created spider 'scrapyorg' using template 'crawl'
scrapy crawl
scrapy list
列出当前项目中的所有可用spider
scrapy edit
使用EDITOR环境变量中定义的编辑器或(如果未设置)EDITOR设置编辑给定的spider。通常不用,因为会在IDE里直接编辑
scrapy fetch
使用Scrapy下载程序下载给定的URL,并将内容写入标准输出。
scrapy vire
在浏览器中打开给定的URL,因为您的Scrapy spider会“看到”它。有时spider会看到不同于常规用户的页面,因此可以用来检查spider“看到”的内容并确认它是您所期望的。
scrapy shell [url]
为给定的URL启动Scrapy shell(如果给定),如果没有给出URL,则为空
scrapy parse
fetch给定的url并parse(解析)
scrapy runspider <spider_file.py>
在Python文件中运行自包含的spider,而无需创建项目。
scrapy version -v
列出包的版本信息
scrapy bench
运行快速基准测试
还可以使用该COMMANDS_MODULE设置添加自定义项目命令
Spiders
Spider是定义如何抓取某个站点(或一组站点)的类,是您为特定站点(或者在某些情况下,一组站点)爬网和解析页面定义自定义行为的地方。
scrapy.Spider
这是最简单的spider,也是每个其他spider必须继承的spider(包括与Scrapy捆绑在一起的spider,以及你自己编写的spider)。它不提供任何特殊功能。它只提供了一个默认start_requests()实现,它从start_urlsspider属性发送请求,并parse 为每个结果响应调用spider的方法
name:一个字符串,用于定义此spider的名称。spider名称是Scrapy如何定位(并实例化)spider,因此它必须是唯一的且必需的。
allowed_domains
包含允许此爬网爬网的域的字符串的可选列表。如果OffsiteMiddleware启用,则不会遵循对不属于此列表(或其子域)中指定的域名的URL的请求
start_urls
当没有指定特定URL时,spider将会从strat_urls列表里头爬取
start_requests()
此方法必须返回一个iterable,其中包含第一个要爬网的请求;
parse(respone)
这是Scrapy在其请求未指定回调时处理下载的响应时使用的默认回调
CrawlSpider
这是用于抓取常规网站的最常用的蜘蛛,因为它通过定义一组规则为跟踪链接提供了便利的机制。
除了从Spider继承的属性(您必须指定)之外,此类还支持新属性:
rules
这是一个(或多个)Rule对象的列表。每个Rule 定义用于爬网站点的特定行为
parse_start_url(response)
Crawling rules
link_extractor是一个Link Extractor对象,它定义如何从每个已爬网页面中提取链接
XMLFeedSpider
XMLFeedSpider旨在通过按某个节点名称迭代XML feed来解析XML feed。迭代器可以选自:iternodes,xml,和html
iterator:一个字符串,它定义要使用的迭代器..
'iternodes' - 基于正则表达式的快速迭代器
'html'
'xml'
CSVFeedSpider
这个spider与XMLFeedSpider非常相似,只不过它遍历行而不是节点。在每次迭代中调用的方法是parse_row()。
Selectors
在抓取网页时,您需要执行的最常见任务是从HTML源提取数据。有几个库可用于实现此目的
BeautifulSoup是Python程序员中非常流行的Web抓取库,它根据HTML代码的结构构造一个Python对象,并且合理地处理坏标记,但它有一个缺点:它很慢
lxml是一个XML解析库(也可以解析HTML),它使用基于ElementTree的pythonic API
parsel与beautifulsoup也是HTML,XML解析库
Scrapy带有自己的提取数据机制。它们被称为选择器
XPath是一种用于在XML文档中选择节点的语言,也可以与HTML一起使用。CSS是一种将样式应用于HTML文档的语言。它定义选择器以将这些样式与特定HTML元素相关联.Scrapy选择器是在lxml库上构建的
Items
为了定义通用输出数据格式,Scrapy提供了Item类。 Item对象是用于收集抓取数据的简单容器。它们提供类似字典的 API,并具有用于声明其可用字段的方便语法
item loaders
Items提供了抓取数据的容器,而Item Loaders提供了填充该容器的机制。
Shell
.如果安装了IPython,Scrapy shell将使用它(而不是标准的Python控制台)。该IPython的控制台功能更强大,并提供智能自动完成和彩色输出,等等;输入scrapy shell,即进入了shell环境,该环境是以python环境为基础的。自然支持python命令
fetch(url[, redirect=True]) - 从给定的URL获取新响应并相应地更新所有相关对象。您可以选择要求HTTP 3xx重定向,然后不要传递redirect=False
fetch(request) - 从给定请求中获取新响应并相应地更新所有相关对象。
view(response) - 在本地Web浏览器中打开给定的响应,以进行检查。
from scrapy.shell import inspect_response
inspect_response(response,self)检查该响应,进入shell模式
Requests and Responses
Request参数:
url
callback:- 将使用此请求的响应(一旦下载)调用的函数作为其第一个参数。如果请求未指定回调,则将使用spider的 parse()方法。请注意,如果在处理期间引发异常,则会调用errback。
method:表示请求中的HTTP方法的字符串。这必须保证是大写的。例如:"GET","POST","PUT",等

浙公网安备 33010602011771号