以下链接¶比如说,你不需要从http://quotes.toscrape.com的前两页抓取内容,而是需要从网站上所有页面的引用。 既然您知道了如何从页面中提取数据,那么让我们看看如何从页面中跟踪链接。 第一件事是提取到我们要跟踪的页面的链接。检查我们的页面,我们可以看到有一个链接指向下一个带有以下标记的页面: <ul class="pager">
<li class="next">
<a href="/page/2/">Next <span aria-hidden="true">→</span></a>
</li>
</ul>
我们可以尝试在外壳中提取: >>> response.css('li.next a').get()
'<a href="/page/2/">Next <span aria-hidden="true">→</span></a>'
这将获取anchor元素,但我们需要该属性 >>> response.css('li.next a::attr(href)').get()
'/page/2/'
还有一个 >>> response.css('li.next a').attrib['href']
'/page/2/'
现在让我们看看我们的spider被修改为递归地跟踪下一页的链接,从中提取数据: 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').get(),
'author': quote.css('small.author::text').get(),
'tags': quote.css('div.tags a.tag::text').getall(),
}
next_page = response.css('li.next a::attr(href)').get()
if next_page is not None:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback=self.parse)
现在,在提取数据之后, 这里您看到的是scrapy的以下链接机制:当您在回调方法中生成一个请求时,scrapy将计划发送该请求,并注册一个回调方法,以便在该请求完成时执行。 使用它,您可以构建复杂的爬虫程序,这些爬虫程序根据您定义的规则跟踪链接,并根据所访问的页面提取不同类型的数据。 在我们的示例中,它创建了一种循环,跟踪到下一页的所有链接,直到找不到一个为止——这对于爬行博客、论坛和其他带有分页的站点很方便。 |
Archiver|手机版|笨鸟自学网 ( 粤ICP备20019910号 )
GMT+8, 2024-11-21 21:24 , Processed in 0.054484 second(s), 17 queries .