【问题标题】:Recursive Scraping on Craigslist with Scrapy使用 Scrapy 对 Craigslist 进行递归抓取
【发布时间】:2014-04-06 14:23:19
【问题描述】:

我一直在尝试通过构建爬虫来磨练我的 Python 技能,最近从 bs4 切换到了 scrapy,以便我可以使用它的多线程和下载延迟功能。我已经能够制作一个基本的刮板并将数据输出到 csv,但是当我尝试添加递归功能时,我遇到了问题。我尝试遵循Scrapy Recursive download of Content 的建议,但不断收到以下错误:

调试:重试 http://medford.craigslist.org%20%5Bu'/cto/4359874426.html'%5D> DNS 查找失败:找不到地址

这让我觉得我尝试加入链接的方式不起作用,因为它将字符插入 url,但我不知道如何解决它。有什么建议吗?

代码如下:

#-------------------------------------------------------------------------------
# Name:        module1
# Purpose:
#
# Author:      CD
#
# Created:     02/03/2014
# Copyright:   (c) CD 2014
# Licence:     <your licence>
#-------------------------------------------------------------------------------
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from craigslist_sample.items import CraigslistSampleItem
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.http import Request
from scrapy.selector import *

class PageSpider(BaseSpider):
    name = "cto"

    start_urls = ["http://medford.craigslist.org/cto/"]

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

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

            url = "http://medford.craiglist.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

【问题讨论】:

  • url = "http://medford.craiglist.org %s" % item['link'] 不可能是对的,但我不知道你真正想要什么。您可能想了解标准库 urlparse 模块。
  • 我从我发布的链接中提取了该行。我试图做的是让它拉它找到的链接并将其添加到 Craigslist url 以获取每个页面的地址。
  • 在文件顶部插入import sys,并在url = 行之前插入sys.stderr.write(repr(item[link]) + "\n")。它打印什么?
  • 另外,可能不是您的直接问题,但for titles in titles: 对我来说似乎是一个错字。不应该是for title in titles 或类似的吗?
  • 我认为标题中的标题也是错误的,但是按照本教程进行操作 - mherman.org/blog/2012/11/05/scraping-web-pages-with-scrapy 我尝试了代码并返回了链接列表,然后它开始抛出该错误。尝试了下面的建议,因为那是我脑海中的格式,只是不记得正确的方法并且它有效。我通过了 codecademy 和 learnpythonthehardway 课程,遇到了一些文档可能会理解的问题,但仍然有点超出我的想象。对了解更多细微差别有何建议?

标签: python python-2.7 recursion web-scraping scrapy


【解决方案1】:

结果是你的代码:

 url = "http://medford.craiglist.org %s" % item['link']

生成:

http://medford.craigslist.org [u'/cto/4359874426.html']

item['link'] 在您的代码中返回一个列表,而不是您期望的字符串。你需要这样做:

url = 'http://medford.craiglist.org{}'.format(''.join(item['link']))

【讨论】:

  • 成功了!感谢您解释我为什么会出现错误,而不仅仅是如何修复它。这是有道理的,.join 是我认为我需要的我只是在尝试我最初发布的内容之前无法使其工作。要是我能加分就好了……如果您能提供帮助,还有一个问题,因为 Craigslist 有 100 个列表的页面,我将如何在第一页上实现对链接的递归抓取,然后对以下页面?例如,第一页是 medford.craigslist.org/cto/,然后第二页是medford.craigslist.org/cto/index100.html,等等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多