Scrapy spider 蜘蛛
Spider 是一个类,负责定义如何通过网站跟踪链接并从页面中提取信息。
Scrapy默认的爬虫如下
scrapy.Spider
它是所有其他蜘蛛都必须继承的蜘蛛。 它有以下类
class scrapy.spiders.Spider
下表是 scrapy.Spider
类的字段
序号 | 字段 | 描述 |
---|---|---|
1 | name | 这是你的蜘蛛的名字。 |
2 | allowed_domains | 它是蜘蛛爬行的域列表。 |
3 | start_urls | 它是一个 URL 列表,这将是以后爬行的根,蜘蛛将从那里开始爬行。 |
4 | custom_settings | 这些是设置,当运行蜘蛛时,将从项目范围的配置中覆盖。 |
5 | crawler | 它是一个链接到蜘蛛实例绑定到的 Crawler 对象的属性。 |
6 | settings | 这些是运行蜘蛛的设置。 |
7 | logger | 它是一个用于发送日志消息的 Python 记录器。 |
8 | from_crawler(crawler,*args,**kwargs) | 它是一个类方法,它创建你的蜘蛛。 参数是 −
|
9 | start_requests() | 当没有指定特定的 URL 并且蜘蛛被打开以进行抓取时,Scrapy 调用 start_requests() 方法。 |
10 | make_requests_from_url(url) | 它是一种用于将 url 转换为请求的方法。 |
11 | parse(response) | 此方法处理响应并返回跟随更多 URL 的报废数据。 |
12 | log(message[,level,component]) | 它是一种通过蜘蛛记录器发送日志消息的方法。 |
13 | closed(reason) | 当蜘蛛关闭时调用此方法。 |
Spider 参数
Spider 参数用于指定起始 URL,并使用带 -a 选项的爬网命令传递,如下所示
$ scrapy crawl first_scrapy -a group = accessories
下面的代码演示了蜘蛛如何接收参数
import scrapy
class FirstSpider(scrapy.Spider):
name = "first"
def __init__(self, group = None, *args, **kwargs):
super(FirstSpider, self).__init__(*args, **kwargs)
self.start_urls = ["http://www.example.com/group/%s" % group]
通用Spider
我们可以使用通用Spider从中继承我们的Spider。 他们的目标是根据特定规则跟踪网站上的所有链接,从所有页面中提取数据。
对于以下蜘蛛中使用的示例,假设我们有一个包含以下字段的项目
import scrapy
from scrapy.item import Item, Field
class First_scrapyItem(scrapy.Item):
product_title = Field()
product_link = Field()
product_description = Field()
CrawlSpider
CrawlSpider
定义了一组规则来跟踪链接并废弃多个页面。 它有以下类
class scrapy.spiders.CrawlSpider
以下是 CrawlSpider
类的属性
rules
它是定义爬虫如何跟踪链接的规则对象列表。
CrawlSpider类规则如下表
序号 | 规则 | 描述 |
---|---|---|
1 | LinkExtractor | 它指定蜘蛛如何跟踪链接并提取数据。 |
2 | callback | 在抓取每个页面后调用它。 |
3 | follow | 它指定是否继续跟踪链接。 |
parse_start_url(response)
它通过允许解析初始响应来返回项目或请求对象。
注意
- 确保在编写规则时重命名解析函数而不是解析函数,因为CrawlSpider
使用解析函数来实现其逻辑。
我们看下面的例子,spider开始爬取 demoexample.com 的主页,收集所有的页面,链接,用 parse_items
方法解析
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class DemoSpider(CrawlSpider):
name = "demo"
allowed_domains = ["www.demoexample.com"]
start_urls = ["http://www.demoexample.com"]
rules = (
Rule(LinkExtractor(allow =(), restrict_xpaths = ("//div[@class = 'next']",)),
callback = "parse_item", follow = True),
)
def parse_item(self, response):
item = DemoItem()
item["product_title"] = response.xpath("a/text()").extract()
item["product_link"] = response.xpath("a/@href").extract()
item["product_description"] = response.xpath("div[@class = 'desc']/text()").extract()
return items
XMLFeedSpider
它是从 XML 提要中抓取并遍历节点的蜘蛛的基类。 它有以下类
class scrapy.spiders.XMLFeedSpider
下表显示了用于设置迭代器和标记名称的类属性
序号 | 标记 | 描述 |
---|---|---|
1 | iterator | 它定义了要使用的迭代器。 它可以是 iternodes、html 或 xml。 默认是迭代节点。 |
2 | itertag | 它是一个带有要迭代的节点名称的字符串。 |
3 | namespaces | 它由使用 register_namespace() 方法自动注册命名空间的 (prefix, uri) 元组列表定义。 |
4 | adapt_response(response) | 它接收响应并在响应主体从蜘蛛中间件到达后立即修改响应主体,然后蜘蛛开始解析它。 |
5 | parse_node(response,selector) | 当为匹配提供的标签名称的每个节点调用时,它会接收响应和选择器。
|
6 | process_results(response,results) | 它返回蜘蛛返回的结果和响应列表。 |
CSVFeedSpider
它遍历每一行,接收一个 CSV 文件作为响应,然后调用 parse_row()
方法。 它有以下类
class scrapy.spiders.CSVFeedSpider
下表显示了可以针对 CSV 文件设置的选项
序号 | 选项 | 描述 |
---|---|---|
1 | delimiter | 它是一个包含每个字段的逗号 (',') 分隔符的字符串。 |
2 | quotechar | 它是一个包含每个字段的引号 ('"') 的字符串。 |
3 | headers | 它是可以从中提取字段的语句列表。 |
4 | parse_row(response,row) | 它接收响应和每一行以及标题的键。 |
CSVFeedSpider 示例
from scrapy.spiders import CSVFeedSpider
from demoproject.items import DemoItem
class DemoSpider(CSVFeedSpider):
name = "demo"
allowed_domains = ["www.demoexample.com"]
start_urls = ["http://www.demoexample.com/feed.csv"]
delimiter = ";"
quotechar = "'"
headers = ["product_title", "product_link", "product_description"]
def parse_row(self, response, row):
self.logger.info("This is row: %r", row)
item = DemoItem()
item["product_title"] = row["product_title"]
item["product_link"] = row["product_link"]
item["product_description"] = row["product_description"]
return item
SitemapSpider
SitemapSpider 在站点地图的帮助下通过从 robots.txt 中定位 URL 来抓取网站。 它有以下类
class scrapy.spiders.SitemapSpider
SitemapSpider
的字段如下表
序号 | 字段 | 描述 |
---|---|---|
1 | sitemap_urls | 要抓取的指向站点地图的 URL 列表。 |
2 | sitemap_rules | 它是一个元组列表(regex, callback),其中regex是正则表达式,callback用于处理匹配正则表达式的url。 |
3 | sitemap_follow | 它是要遵循的站点地图正则表达式列表。 |
4 | sitemap_alternate_links | 为单个 url 指定要遵循的备用链接。 |
SitemapSpider 示例
下面的 SitemapSpider
处理所有的 URL
from scrapy.spiders import SitemapSpider
class DemoSpider(SitemapSpider):
urls = ["http://www.demoexample.com/sitemap.xml"]
def parse(self, response):
# You can scrap items here
以下 SitemapSpider
处理一些带回调的 URL
from scrapy.spiders import SitemapSpider
class DemoSpider(SitemapSpider):
urls = ["http://www.demoexample.com/sitemap.xml"]
rules = [
("/item/", "parse_item"),
("/group/", "parse_group"),
]
def parse_item(self, response):
# you can scrap item here
def parse_group(self, response):
# you can scrap group here
以下代码显示 robots.txt 中的站点地图,其 url 具有 /sitemap_company
from scrapy.spiders import SitemapSpider
class DemoSpider(SitemapSpider):
urls = ["http://www.demoexample.com/robots.txt"]
rules = [
("/company/", "parse_company"),
]
sitemap_follow = ["/sitemap_company"]
def parse_company(self, response):
# you can scrap company here
我们甚至可以将 SitemapSpider
与其他 URL 结合使用,如以下命令所示。
from scrapy.spiders import SitemapSpider
class DemoSpider(SitemapSpider):
urls = ["http://www.demoexample.com/robots.txt"]
rules = [
("/company/", "parse_company"),
]
other_urls = ["http://www.demoexample.com/contact-us"]
def start_requests(self):
requests = list(super(DemoSpider, self).start_requests())
requests += [scrapy.Request(x, self.parse_other) for x in self.other_urls]
return requests
def parse_company(self, response):
# you can scrap company here...
def parse_other(self, response):
# you can scrap other here...