Scrapy蜘蛛
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) 这是一种创建蜘蛛的类方法。参数是 - * crawler \- 蜘蛛实例将被绑定到的爬虫。 * args(list) \- 这些参数传递给方法 __init__() 。 * kwargs(dict) \- 将这些关键字参数传递给 __init__() 方法。 |
| 9 | start_requests() 如果没有指定特定的URL,并且为捕捉而打开蜘蛛,则Scrapy会调用 _start_requests()_ 方法。 |
| 10 | make_requests_from_url(URL) 这是一种用于将网址转换为请求的方法。 |
| 11 | parse(response) 此方法处理响应并在更多URL后返回报废的数据。 |
| 12 | log(message[,level,component]) 这是一种通过蜘蛛记录器发送日志消息的方法。 |
| 13 | closed(reason) 这个方法在蜘蛛关闭时被调用。 |
蜘蛛参数
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]
通用蜘蛛
您可以使用通用的蜘蛛来从您的蜘蛛派生子类。
他们的目标是根据一定的规则来跟踪网站上的所有链接,从所有页面提取数据。
对于以下蜘蛛中使用的示例,我们假设我们有一个包含以下字段的项目:
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类的属性:
规则
它是规则对象的列表,定义了爬行程序如何遵循链接。
下表显示了CrawlSpider类的规则:
| 序号 | 规则和说明 |
|---|---|
| 1 | LinkExtractor 它指定蜘蛛如何遵循链接并提取数据。 |
| 2 | callback 这是每个页面被刮后被调用。 |
| 3 | follow 它指定是否继续跟踪链接。 |
parse_start_url(响应)
它通过允许解析初始响应来返回项目或请求对象。
注 - 确保在编写规则时重命名解析函数而不是解析,因为CrawlSpider使用解析函数来实现其逻辑。
让我们来看看下面的例子,蜘蛛开始抓取demoexample.com的主页,使用 _parseitems 方法收集所有页面,链接和分析:
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 Feed中抓取并在节点上迭代。它有以下类:
class scrapy.spiders.XMLFeedSpider
下表显示了用于设置迭代器和标记名称的类属性:
| 序号 | 属性和描述 |
|---|---|
| 1 | iterator 它定义了要使用的迭代器。它可以是 _iternodes,html_ 或 _xml_ 。默认是 _iternodes_ 。 |
| 2 | itertag 它是一个包含节点名称的字符串,用于迭代。 |
| 3 | namespaces 它由(prefix,uri)元组列表定义,它们使用 _register_namespace()_ 方法自动注册名称空间。 |
| 4 | adapt_response(response) 它在蜘蛛开始分析它之前,一收到响应并在响应体从蜘蛛中间件到达时立即修改它。 |
| 五 | 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在 Sitemaps 的帮助下通过查找robots.txt中的网址来抓取网站。它有以下类:
class scrapy.spiders.SitemapSpider
下表显示SitemapSpider的字段 -
| 序号 | 字段和说明 |
|---|---|
| 1 | sitemap_urls 您要抓取指向站点地图的网址列表。 |
| 2 | sitemap_rules 它是一个元组列表(regex,callback),其中regex是一个正则表达式,回调用于处理匹配正则表达式的URL。 |
| 3 | sitemap_follow 这是一个网站地图的正则表达式列表。 |
| 4 | sitemap_alternate_links 指定要为单个网址执行的备用链接。 |
SitemapSpider示例
以下SitemapSpider处理所有网址:
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处理一些带回调的网址:
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中其网址具有 / 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与其他网址结合使用,如以下命令所示:
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...
下一章:Scrapy 选择器
Scrapy选择器:在抓取网页时,您需要使用称为 选择器 的机制,通过使用XPath或CSS表达式来提取HTML源代码的某个部分。选择器建立在lxml库上,该库用Python语言处理XML和HTML。使用下面的代码片段来定义选择器的不同概念 ...
AI 中文社