发布时间:2019/11/18 16:36:10   更新时间:2020/07/31 19:48:20
前提环境:
apt-get update
apt install python3-pip
pip3 install virtualenv
cd /home/scrapy
virtualenv --no-site-packages env
source /home/scrapy/env/bin/activate
安装命令
pip install scrapy
scrapy 查看命令列表
scrapy <command> -h 获取有关每个命令的更多信息
举例方式提供:
scrapy startproject myproject 创建项目
scrapy genspider spider1.py example.com 创建一个蜘蛛模板。
scrapy settings --get BOT_NAME 获取设置值,比如BOT_NAME
scrapy runspider <spider_file.py> 无需创建项目即可运行包含在Python文件中的蜘蛛程序。
scrapy shell <url> (给定url),启动shell,可以在shell下敲命令。
scrapy fetch https://www.pyfield.com 使用Scrapy下载器下载给定的URL,并将内容写入标准输出。
scrapy view https://www.pyfield.com 使用浏览器打开url,有时候scrapy看到的东西会有所不同。
scrapy version -v 查看scrapy版本,还有相关其它库的版本。
项目命令要进入项目的文件夹目录内运行
scrapy crawl spider1 运行蜘蛛
scrapy check 检查蜘蛛
scrapy list 查看蜘蛛列表
scrapy edit spider1 编辑蜘蛛,会打开一个编辑器编辑源码。一般不用,用IDE写代码。
scrapy parse https://www.pyfield.com 获取给定的URL并与处理它的spider解析。
scrapy bench运行快速基准测试。
scrapy startproject your_name
基本的目录结构
your_name/ #你的根目录,
scrapy.cfg # 部署配置文件
your_name / #项目的Python模块,您将从这里导入您的代码。
__init__.py
items.py # 项目 items 定义文件
middlewares.py #项目middlewares 文件
pipelines.py #项目pipelines文件
settings.py #项目settings文件
spiders/ #一个目录,您稍后将在其中放置您的spiders。
__init__.py
spider1.py
spider2.py
spider3.py
1、发送request、收到response。
2、用选择器(selectors)提取数据,用项(item)当接收数据的容器。用项加载器(item loader)中的输入输出处理器(Input and Output processors)处理数据,并把数据填充到item容器中。
3、让项(item)经过项管道(item pipeline)进行进一步处理。
4、用数据导出(feed exports)按照指定的格式,通过指定的后端导出。
5、继续探索爬行网页上的其它链接。比如通用spider里的CrawlSpider。
scrapy genspider spider_pyfield pyfield.com
class SpiderPyfieldSpider(scrapy.Spider):
#唯一标识spider。如果spider抓取单个域,则通常的做法是使用该域命名spider。
name = 'spider_pyfield'
#包含此蜘蛛可以爬网的域的字符串的可选列表。
allowed_domains = ['pyfield.com']
#开始爬网的URL列表。默认为每个网址生成Request实例,并用实现start_requests生成器。
#生成器是指,带有yield的函数。每次迭代给出一个结果。分散了时间、节省了内存。实现了异步。
start_urls = ['http://pyfield.com/']
def parse(self, response):
pass
spider程序是定义如何爬取某个站点(或一组站点)的类,包括如何执行爬取(即跟踪链接)以及如何从其页面中提取结构化数据(即提取项)。换句话说,Spider是您定义自定义行为的地方,该行为用于爬网和解析特定站点(或在某些情况下为一组站点)的页面。
对于蜘蛛,爬取周期经历如下过程:
1、首先,生成初始请求(request)以爬网第一个URL,然后指定要调用的回调函数,并从这些请求中下载响应(response)。
2、在回调函数中,您解析响应(网页)并返回提取数据的dict(字典),Item对象,Request对象,或者这些对象的可迭代对象的。这些请求还将包含一个回调(可能相同),然后由Scrapy下载,然后由指定的回调处理响应。
3、在回调函数中,通常使用选择器(但也可以使用BeautifulSoup,lxml或您喜欢的任何机制)来解析页面内容, 并使用已解析的数据生成项(item)。
4、最后,通常将从蜘蛛返回的项目保存到数据库(在某些项目管道中)或使用Feed导出写入文件。
name 标识spider
allowed_domains包含此蜘蛛可以爬网的域的字符串的可选列表。
start_urls爬的URL列表。为每个网址生成Request实例,实现start_requests生成器。
custom_settings运行此Spider时将从项目范围的配置中覆盖的设置字典。
crawler这个属性是由from_crawler()类方法在初始化该类之后设置的
settings 配置
logger 用spider的name创造了python的logger。
log 日志,兼容老版本。
from_crawler这是Scrapy用于创建蜘蛛的类方法。
start_requests返回带有第一个Request的实例,并用yield实现了生成器。
parse当他们的请求未指定回调时,这是Scrapy用于处理已下载响应的默认回调。可以用yield实现多个返回。
closed在spider关闭时调用。
项目运行时的命令与spider程序的parse函数实现有关。
如何运行要看parse实现返回的方式
scrapy crawl spider_pyfield
scrapy crawl spider_pyfield -a tag=html
增加参数,在程序里使用。
scrapy crawl spider_pyfield -a tag=html
这些参数将传递给Spider的__init__方法,并在默认情况下成为Spider属性。
这也意味着
1、你可以在__init__函数直接访问参数
def __init__(self, category=None, *args, **kwargs):
super(MySpider, self).__init__(*args, **kwargs)
tag
2、在其它函数里访问
self.tag
或者
tag = getattr(self, 'tag', None)
Scrapy附带了一些有用的通用spider,您可以使用它们对spider进行子分类。他们的目的是为一些常见的抓取情况提供便利的功能。
这是用于爬取常规网站的最常用的蜘蛛,因为它通过定义一组规则为跟踪链接提供了一种便捷的机制。它可能不是最适合您的特定网站或项目的方法,但是它在某些情况下足够通用,因此您可以从中开始并根据需要覆盖它以获取更多自定义功能,或者只是实现自己的蜘蛛。
除了从Spider继承的属性(必须指定)之外,此类还支持一个新属性:
rules
这是一个(或多个)Rule对象的列表。每个都Rule 定义了用于爬网的特定行为。规则对象如下所述。如果多个规则匹配同一链接,则将根据在此属性中定义的顺序使用第一个规则。
Rule对象:
scrapy.spiders.Rule
(link_extractor = None,callback = None,cb_kwargs = None,follow = None,process_links = None,process_request = None )
link_extractor
是一个
链接提取器
对象,它定义如何从每个已爬网页面提取链接。
callback
是为使用指定链接提取器提取的每个链接的回调方法。
这个spider还公开了一个可重写的方法:
parse_start_url(回应)
该方法用于start_urls响应。它允许解析初始响应,并且必须返回一个 Item对象、一个Request 对象,或包含其中任何一个的可迭代对象。
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 = (
# Extract links matching 'category.php' (but not matching 'subsection.php')
# and follow links from them (since no callback means follow=True by default).
Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),
# Extract links matching 'item.php' and parse them with the spider's method parse_item
Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'),
)
def parse_item(self, response):
self.logger.info('Hi, this is an item page! %s', response.url)
item = scrapy.Item()
item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)')
item['name'] = response.xpath('//td[@id="item_name"]/text()').get()
item['description'] = response.xpath('//td[@id="item_description"]/text()').get()
item['link_text'] = response.meta['link_text']
return item
该spider将开始抓取example.com的主页,收集category链接和item链接,并使用parse_item方法解析后者。对于每个item response,将使用XPath从HTML中提取一些数据,并用这些数据填充Item。
链接提取器是对象,其唯一目的是从scrapy.http.Response最终将要遵循的网页(对象)中提取链接。
每个链接提取器具有的唯一公共方法是extract_links,该方法接收一个Response对象并返回scrapy.link.Link对象列表。
CrawlSpider 类中使用了链接提取器,通过一组规则,但是即使不从中继承子类CrawlSpider,也可以在蜘蛛中使用它 ,因为其目的非常简单:提取链接。
scrapy.linkextractors模块中提供了与Scrapy捆绑在一起的链接提取程序类 。默认的链接提取器为LinkExtractor
XMLFeedSpider的设计目的是通过按特定的节点名遍历XML提要来解析XML feeds。可以从:iternode、xml和html中选择迭代器。出于性能考虑,建议使用iternodes迭代器,因为xml和html迭代器会同时生成整个DOM来解析它。但是,在使用错误的标记解析XML时,使用html作为迭代器可能很有用。
这个爬行器与XMLFeedSpider非常相似,只是它迭代的是行row,而不是节点node。在每个迭代中调用的方法是parse_row()。
SitemapSpider允许您通过使用站点地图(sitemaps)发现url来爬行站点。
它支持嵌套的站点地图和从robots.txt中发现站点地图url。
站点地图(sitemaps)是网站站长通知搜索引擎有关其站点上可进行爬网的页面的一种简便方法。Sitemap是最简单的形式,它是一个XML文件,其中列出了站点的URL以及有关每个URL的其他元数据(相对于站点中其他URL,上一次更新的时间,通常更改的频率以及重要性) ),以便搜索引擎可以更智能地抓取该网站。
Web爬网程序通常从站点内的链接和其他站点发现页面。Sitemaps补充了这些数据,以允许支持Sitemaps的爬网程序拾取Sitemaps中的所有URL并使用关联的元数据了解这些URL。使用Sitemap 协议不能保证网页会包含在搜索引擎中,但是会为网络爬虫提供提示,以帮助他们更好地抓取您的网站。
robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。
当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。百度官方建议,仅当您的网站包含不希望被搜索引擎收录的内容时,才需要使用robots.txt文件。如果您希望搜索引擎收录网站上所有内容,请勿建立robots.txt文件。