【问题标题】:Pass input file to scrapy containing a list of domains to be scraped将输入文件传递给包含要抓取的域列表的scrapy
【发布时间】:2014-01-09 06:19:01
【问题描述】:

我看到了这个链接 [a link] (Pass Scrapy Spider a list of URLs to crawl via .txt file)! 这会更改开始 url 的列表。我想为每个域(从一个文件)抓取网页并将结果放入一个单独的文件(以域命名)。 我已经为一个网站抓取了数据,但我已经在蜘蛛本身中指定了起始 url 和 allowed_domains 。如何使用输入文件进行更改。

更新 1:

这是我尝试过的代码:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item, Field

class AppleItem(Item):
    reference_link = Field()
    rss_link = Field()

class AppleSpider(CrawlSpider):

    name = 'apple'
    allowed_domains = []
    start_urls = []

    def __init__(self):
        for line in open('./domains.txt', 'r').readlines():
            self.allowed_domains.append(line)
            self.start_urls.append('http://%s' % line)

    rules = [Rule(SgmlLinkExtractor(allow=()), follow=True, callback='parse_item')]

    def parse_item(self, response):
        sel = HtmlXPathSelector(response)
        rsslinks = sel.select('//a[contains(@href, "pdf")]/@href').extract()
        items = []
        for rss in rsslinks:
          item = AppleItem()
          item['reference_link'] = response.url
          item['rss_link'] = rsslinks
          items.append(item)
        filename = response.url.split("/")[-2]
        open(filename+'.csv', 'wb').write(items)

运行此命令时出现错误:AttributeError: 'AppleSpider' object has no attribute '_rules'

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    您可以使用蜘蛛类的__init__方法读取文件并重写start_urlsallowed_domains

    假设我们有文件domains.txt 的内容:

    example1.com
    example2.com
    ...
    

    示例:

    class MySpider(BaseSpider):
        name = "myspider"
        allowed_domains = []
        start_urls = []
    
        def __init__(self):
            for line in open('./domains.txt', 'r').readlines():
                self.allowed_domains.append(line)
                self.start_urls.append('http://%s' % line)
    
        def parse(self, response):
            # here you will get data parsing page
            # than put your data into single file
            # from scrapy toturial http://doc.scrapy.org/en/latest/intro/tutorial.html
            filename = response.url.split("/")[-2]
            open(filename, 'wb').write(your_data)
    

    【讨论】:

    • 非常感谢。但是如何将属于一个域的解析数据放到以该域命名的输出文件中呢?
    • 我在这个定义中返回一些东西(返回项目)。最初我使用:scrapy crawl apple --set FEED_URI=apple_result.json --set FEED_FORMAT=jsonlines 如果我使用这个,我应该将返回项替换为:filename = response.url.split("/")[-2] open (filename, 'wb').write(items)
    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多