使用抓取按扩展名类型将文件保存在网页上



我对Python很陌生,我正在尝试使用scrapy下载并保存本网站中的pdf文件:http://www.legco.gov.hk/general/chinese/counmtg/yr04-08/mtg_0708.htm#hansard

以下是我的代码:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector

class legco(BaseSpider):
  name = "legco"
  allowed_domains = ["http://www.legco.gov.hk/"]
  start_urls = ["http://www.legco.gov.hk/general/chinese/counmtg/yr04-08/mtg_0708.htm#hansard"]
  rules =(
    Rule(SgmlLinkExtractor(allow=r".pdf"), callback="save_pdf")
          )
def parse_listing(self, response):
    hxs = HtmlXPathSelector(response)
    pdf_urls=hxs.select("a/@href").extract()
    for url in pdf_urls:
        yield Request(url, callback=self.save_pdf)
def save_pdf(self, response):
    path = self.get_path(response.url)
    with open(path, "wb") as f:
        f.write(response.body)

基本上,我试图将搜索限制为仅带有".pdf"的链接,然后按"a/@hfref"进行选择。

从输出中,我看到此错误:

2015-03-09 11:00:22-0700 [立法会] 错误:蜘蛛错误处理 http://www.legco.gov.hk/general/chinese/counmtg/yr04-08/mtg_0708.htm#hansard>

任何人都可以建议如何修复我的代码吗?多谢!

首先,如果您希望rules工作,则需要使用CrawlSpider。此外,rules应定义为可迭代对象,通常它是一个元组(缺少逗号)。

无论如何,我将使用普通BaseSpider,循环链接并检查href.pdf结尾,而不是采用这种方法,然后在回调中将pdf保存到文件中:

import urlparse
from scrapy.http import Request
from scrapy.spider import BaseSpider

class legco(BaseSpider):
    name = "legco"
    allowed_domains = ["www.legco.gov.hk"]
    start_urls = ["http://www.legco.gov.hk/general/chinese/counmtg/yr04-08/mtg_0708.htm#hansard"]
    def parse(self, response):
        base_url = 'http://www.legco.gov.hk/general/chinese/counmtg/yr04-08/'
        for a in response.xpath('//a[@href]/@href'):
            link = a.extract()
            if link.endswith('.pdf'):
                link = urlparse.urljoin(base_url, link)
                yield Request(link, callback=self.save_pdf)
    def save_pdf(self, response):
        path = response.url.split('/')[-1]
        with open(path, 'wb') as f:
            f.write(response.body)

(为我工作)

最新更新