1

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

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

page = 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。此外,即使我再次运行它,它也会继续删除相同的页面,但并非总是如此。关于我的方法中可能出现的错误或我缺少什么的任何想法?

提前致谢。

4

2 回答 2

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

它有效,但它只转储第一页。我会留给您了解如何获得其他结果。

希望有帮助。

于 2013-06-01T23:26:10.730 回答
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()以及如何生成下一个 url。但我在这里帮不了你,因为我不使用 Scrapy。我仍然使用纯 python(和 pyQuery)来创建简单的爬虫;)

PS。有时服务器会检查您的 UserAgent、IP、您抓取下一页的速度并停止向您发送页面。

于 2013-05-31T18:27:23.420 回答