Scrapy爬虫无法从多个页面抓取数据

时间:2013-05-31 17:26:47

标签: python web-scraping scrapy web-crawler

我正在尝试废弃以下页面的结果:

http://www.peekyou.com/work/autodesk/page=1

页面= 1,2,3,4 ......根据结果等等。所以我得到一个php文件来运行爬虫为不同的页码运行它。代码(单页)如下:

`import sys
 from scrapy.spider import BaseSpider
 from scrapy.selector import HtmlXPathSelector
 from scrapy.contrib.spiders import CrawlSpider, Rule
 from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
 from scrapy.selector import HtmlXPathSelector
 from scrapy.item import Item
 from scrapy.http import Request
 #from scrapy.crawler import CrawlerProcess

 class DmozSpider(BaseSpider):
 name = "peekyou_crawler"

 start_urls = ["http://www.peekyou.com/work/autodesk/page=1"];

 def parse(self, response):

     hxs = HtmlXPathSelector(response)

     discovery = hxs.select('//div[@class="nextPage"]/table/tr[2]/td/a[contains(@title,"Next")]')
     print len(discovery)

     print "Starting the actual file"
     items = hxs.select('//div[@class="resultCell"]')
     count = 0
     for newsItem in items:
        print newsItem

        url=newsItem.select('h2/a/@href').extract()
        name = newsItem.select('h2/a/span/text()').extract()
        count = count + 1
        print count
        print url[0]
        print name[0]

        print "\n"

` Autodesk结果页面有18页。当我运行代码来抓取所有页面时,抓取工具只从第2页获取数据而不是所有页面。同样,我将公司名称更改为其他名称。再次,它会废弃一些页面而不是休息。我在每个页面上获得http响应200但是。此外,即使我继续运行它,它仍然会继续废弃相同的页面,但并非总是如此。任何想法可能是我的方法中的错误或我错过了什么?

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以添加更多地址:

start_urls = [
    "http://www.peekyou.com/work/autodesk/page=1",
    "http://www.peekyou.com/work/autodesk/page=2",
    "http://www.peekyou.com/work/autodesk/page=3"
];

您可以生成更多地址:

start_urls = [
    "http://www.peekyou.com/work/autodesk/page=%d" % i for i in xrange(18)
];

我认为您应该阅读start_requests()以及如何生成下一个网址。但我不能帮助你,因为我不使用Scrapy。我仍然使用纯python(和pyQuery)来创建简单的抓取工具;)

PS。有时,服务器会检查您的UserAgent,IP,您下一页的速度以及停止向您发送页面的速度。

答案 1 :(得分:1)

我会给你一个起点。

您尝试抓取的页面是通过AJAX加载的,这是scrapy的问题 - 它无法通过ajax XHR请求处理动态页面加载。有关详细信息,请参阅:

使用浏览器开发人员工具,您可能会注意到页面加载后有一个传出的POST请求。这将是http://www.peekyou.com/work/autodesk/web_results/web_tag_search_checker.php

因此,在scrapy中模拟这一点应该可以帮助您抓取必要的数据:

from scrapy.http import FormRequest
from scrapy.item import Item, Field
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector


class DmozItem(Item):
    name = Field()
    link = Field()


class DmozSpider(BaseSpider):
    name = "peekyou_crawler"

    start_urls = start_urls = [
        "http://www.peekyou.com/work/autodesk/page=%d" % i for i in xrange(18)
    ]

    def parse(self, response):
        yield FormRequest(url="http://www.peekyou.com/work/autodesk/web_results/web_tag_search_checker.php",
                          formdata={'id': 'search_work_a10362ede5ed8ed5ff1191321978f12a',
                                    '_': ''},
                          method="POST",
                          callback=self.after_post)

    def after_post(self, response):
        hxs = HtmlXPathSelector(response)

        persons = hxs.select("//div[@class='resultCell']")

        for person in persons:
            item = DmozItem()
            item['name'] = person.select('.//h2/a/span/text()').extract()[0].strip()
            item['link'] = person.select('.//h2/a/@href').extract()[0].strip()
            yield item

它可以工作,但它只转储第一页。我会留给你理解你怎么能得到其他结果。

希望有所帮助。