【问题标题】:Scrapy Recursive download of ContentScrapy递归下载内容
【发布时间】:2013-07-04 18:45:51
【问题描述】:

敲了几下头,我终于来了。

问题:我正在尝试下载每个 craiglist 帖子的内容。 我所说的内容是指手机的“发帖主体”。 寻找一部新的旧手机,因为 iPhone 已经完成了所有的兴奋。

代码是 Michael Herman 的出色作品。

我的蜘蛛课堂

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import *
from craig.items import CraiglistSampleItem

class MySpider(CrawlSpider):
    name = "craigs"
    allowed_domains = ["craigslist.org"]
    start_urls = ["http://minneapolis.craigslist.org/moa/"]

    rules = (Rule (SgmlLinkExtractor(allow=("index\d00\.html", ),restrict_xpaths=('//p[@class="nextpage"]',))
    , callback="parse_items", follow= True),
    )

    def parse_items(self,response):
        hxs = HtmlXPathSelector(response)
        titles = hxs.select("//span[@class='pl']")
        items = []
        for titles in titles:
            item = CraiglistSampleItem()
            item ["title"] = titles.select("a/text()").extract()
            item ["link"] = titles.select("a/@href").extract()
            items.append(item)
        return items

还有Item类

from scrapy.item import Item, Field

class CraiglistSampleItem(Item):
    title = Field()
    link = Field()

由于代码将遍历许多链接,因此我想将每部手机的描述保存在单独的 csv 中,但在 csv 中再多一列也可以。

任何线索!!!

【问题讨论】:

    标签: python python-2.7 web-scraping scrapy


    【解决方案1】:

    而不是在parse_items 方法中返回项目,您应该返回/产生scrapy Request 实例,以便从项目页面获取描述linktitle,您可以在Item 内部传递,和 Itemmeta 字典中:

    from scrapy.contrib.spiders import CrawlSpider, Rule
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    from scrapy.http import Request
    from scrapy.selector import *
    
    from scrapy.item import Item, Field
    
    
    class CraiglistSampleItem(Item):
        title = Field()
        link = Field()
        description = Field()
    
    
    class MySpider(CrawlSpider):
        name = "craigs"
        allowed_domains = ["craigslist.org"]
        start_urls = ["http://minneapolis.craigslist.org/moa/"]
    
        rules = (Rule(SgmlLinkExtractor(allow=("index\d00\.html", ), restrict_xpaths=('//p[@class="nextpage"]',))
            , callback="parse_items", follow=True),
        )
    
        def parse_items(self, response):
            hxs = HtmlXPathSelector(response)
    
            titles = hxs.select("//span[@class='pl']")
            for title in titles:
                item = CraiglistSampleItem()
                item["title"] = title.select("a/text()").extract()[0]
                item["link"] = title.select("a/@href").extract()[0]
    
                url = "http://minneapolis.craigslist.org%s" % item["link"]
                yield Request(url=url, meta={'item': item}, callback=self.parse_item_page)
    
        def parse_item_page(self, response):
            hxs = HtmlXPathSelector(response)
    
            item = response.meta['item']
            item['description'] = hxs.select('//section[@id="postingbody"]/text()').extract()
            return item
    

    运行它并在输出的 csv 文件中查看额外的 description 列。

    希望对您有所帮助。

    【讨论】:

    • 非常感谢代码我几乎对scrapy失去了所有信心,并选择了lxml和bs4的路线。对于新用户...... item.py文件是单独的,“cralwer” "文件是分开的。此外,您可能希望将“from craig_help.items import CraiglistSampleItem”添加到 cralwer,其中 craig_help 是创建整个项目的文件夹。
    • 抱歉给您添麻烦了。但似乎“描述”列都是空白的。为项目和爬虫创建不同的文件是不是我做错了什么。
    • 不客气。当然,您可以将您的 Item 类放在适当的位置,只需确保那里有 3 个字段:titlelinkdescription
    • 不幸的是,即使在进行了更改之后,描述项也变成了空白......我的代码中的任何线索都可能是错误的......
    • 非常抱歉 - xpath 表达式错误 - 我已修复 - 请检查。
    猜你喜欢
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多