【问题标题】:Scrapy crawler not able to crawl data from multiple pagesScrapy爬虫无法从多个页面爬取数据
【发布时间】:2023-03-05 09:29:01
【问题描述】:

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

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

提前致谢。

【问题讨论】:

    标签: python web-scraping scrapy web-crawler


    【解决方案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
    

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

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      您可以添加更多地址:

      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、您抓取下一页的速度并停止向您发送页面。

      【讨论】:

      • 我尝试查看这些页面的源代码,看起来结果是稍后加载的,并且一直显示“正在加载”。当我们尝试查看源代码时,也会发生类似的事情。它显示“正在加载”,并且仅在某个时间后才加载。所以我的爬虫在开始抓取时找不到任何要抓取的数据。有什么解决办法吗?
      • 如果结果是稍后加载的,那么必须有一些使用 ajax 的 javascript 来加载它 - 您可以在 javascript 中搜索单词“ajax”、“post”、“get”或“http://”查找加载数据的 url。我还使用 firefox+firebug 来查看浏览器调用了哪些 url——它甚至比在 javascript 中搜索还要快。如果您有一些 url,您可以对其进行测试并使用它直接获取数据。
      猜你喜欢
      • 1970-01-01
      • 2021-09-13
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 2020-02-05
      • 1970-01-01
      相关资源
      最近更新 更多