使用scrapy按扩展类型保存网页上的文件
Using scrapy to save files on a web page by extension type
我是 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”的链接,然后是 select "a/@hfref"。
从输出中,我看到了这个错误:
2015-03-09 11:00:22-0700 [legco] ERROR: Spider error processing 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)
(为我工作)
我是 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”的链接,然后是 select "a/@hfref"。
从输出中,我看到了这个错误:
2015-03-09 11:00:22-0700 [legco] ERROR: Spider error processing 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)
(为我工作)