Scrapy:创建爬行索引页并保存每个相应Lin的整个HTML页面的Spider

2024-05-19 20:12:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Scrapy的新手,正在尝试探索它的一些功能。我希望能够成功地创建一个scraper,它可以抓取页面上的一组链接(比如索引页面),并将整个页面保存为每个对应链接的HTML页面。(逻辑是我可以在以后离线阅读内容,或者在我开始使用Scrapy更高级的功能后创建一个调度程序)

然而,我似乎被困在这个练习上。我有一种感觉,我循环的方式是错误的——无论是for循环、回调还是返回函数。在

我的蜘蛛网.py代码如下:

import urlparse
import scrapy

from scrapy.http import Request


class BasicSpider(scrapy.Spider):
    name = "basic"
    allowed_domains = ["web"]

    start_urls = (
        'http://books.toscrape.com/',
    )

    def parse(self, response):
    # My Link Extractor
        next_selector = response.xpath(
            '//*[@class="nav nav-list"]/li/ul/li/a/@href'
            )
        for url in next_selector.extract():
            yield Request(urlparse.urljoin(response.url, url),
                          callback=self.parse_item)

    def parse_item(self, response):
    # My Page Saver    
        filename = response.url.split("/")[-1] + '.html'
        with open(filename, 'wb') as f:
            f.write(response.body)
            return

如果我按照期望的XPath提取特定的项,我可以让链接提取器工作。我想我可以把整件事用XPath>;>;响应.xpath('html').extract()…但似乎有更好的方法?在

我可以让我的页面保护程序将一个链接的页面保存为从Download a full page with scrapy采用的HTML格式。在

然而,当我试图整合两者时,我遇到了一些问题。我尝试过对for循环、回调和return命令进行修改……但是我遗漏了一些东西。在

如有任何帮助,将不胜感激。在

谨致问候


Tags: importself程序功能httpurlforparse
1条回答
网友
1楼 · 发布于 2024-05-19 20:12:57
import urlparse
import scrapy
from scrapy.linkextractors import LinkExtractor

from scrapy.http import Request


class BooksSpider(scrapy.Spider):
    name = "basic"
    allowed_domains = ["toscrape"]
    #                 ^ allowed domain should be name of domain that you wanna scrap
    start_urls = (
        'http://books.toscrape.com/',
    )

    def parse(self, response):
    # My Link Extractor
        next_page_urls = LinkExtractor(restrict_xpaths='//*[@class="next"]').extract_links(response)
        # This is how we use LinkExtractor or you can create spider Rule for next page.
        # Read more about LinkExtractor form https://doc.scrapy.org/en/latest/topics/link-extractors.html
        for next_page in next_page_urls:
            yield Request(next_page.url,callback=self.parse_item)

    def parse_item(self, response):
    # My Page Saver    
        filename = response.url.split("/")[-1] + '.html'
        with open(filename, 'wb') as f:
            f.write(response.body)
            return

我希望这对你有帮助

相关问题 更多 >