【问题标题】:Scrapy: Create Spider that Crawls Index Page and Saves Entire HTML Page of Each Corresponding LinkScrapy:创建爬取索引页面并保存每个相应链接的整个 HTML 页面的蜘蛛
【发布时间】:2017-09-14 05:12:40
【问题描述】:

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

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

我的 Spider.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 提取特定项目,我可以让 #My Link Extractor 工作。我想我可以 XPath 整个事情 >>>response.xpath('html').extract()...但似乎有更好的方法?

我可以使用#My Page Saver 将单个链接的页面保存为从Download a full page with scrapy 采用的 HTML。

但是,当我尝试将两者整合时遇到了问题。我尝试过修改 for 循环、回调和返回命令……但我遗漏了一些东西。

任何帮助将不胜感激。

问候,

【问题讨论】:

    标签: python python-2.7 scrapy


    【解决方案1】:
    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
    

    希望对你有帮助

    【讨论】:

    • 嗯...我希望它可以正常工作。我遇到了与experiment 相同的问题。我是一个完全的新手,我在 atom 上使用 flake 8 来教我格式。它标记长度超过 79 个字符的行。我尝试遵循格式(并且 flake 接受它)但我想知道它是否会弄乱代码? (请记住,我按照您的指示更改了 allowed_domains。
    • 这个link 是我从你上面的例子中借来的代码。我的第 17-20 行的语法是否可以接受,还是会引发错误?
    • @dldatacowboy 是的,我更关注解决方案,因此我没有遵循 PEP8 指南。但是感谢您下次的建议,我会考虑到这一点:)。
    • 不...不...我不是在批评。我无法获取生成输出的代码。我得到的只是:No Output,我想知道是不是因为我使用 linter?我很困惑。
    • @dldatacowboy 你没有得到输出因为错误allowed_domains
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2013-11-30
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    相关资源
    最近更新 更多