【问题标题】:Trying to crawl values using scrapy尝试使用scrapy抓取值
【发布时间】:2015-07-14 08:07:22
【问题描述】:

我正在尝试使用以下代码从网页中抓取“工作月总收入中位数”:

class crawl_income(scrapy.Spider):

     name = "salary"
     allowed_domains = ["stats.mom.gov.sg"]
     url = 'http://stats.mom.gov.sg/Pages/Income-Summary-Table.aspx'

     def parse_data(self, response):
         table_headers = response.xpath('//tr[@class="odd"]/td/td')
         salary = []
         for value in table_headers:
             data = value.xpath('.//text()').extract()
             salary.append(data)
         print salary

process = CrawlerProcess()
process.crawl(crawl_income)

process.start()

但是当我试图打印出我为存储值而创建的列表时,我没有看到任何值。

我哪里做错了?

【问题讨论】:

    标签: python web-crawler scrapy


    【解决方案1】:

    首先,您的代码将不起作用。

    url 应该是 start_urls 让 Scrapy 知道从哪里开始抓取。

    parse_data 应该是parse,因为没有任何信息,Scrapy 不知道调用哪个方法,默认是parse。否则,当 Scrapy 抓取起始 URL 并且 parse 方法不存在时,您也会得到 NotImplementedError

    当我运行下面的代码(其中包含所有提到的更改)并将response.body 打印到控制台时,我没有找到任何带有class="odd" 的元素,所以我猜网站内有一些 AJAX/XHR 调用然后提供信息。

    编辑

    再次查看您的代码后,我发现 XPath 有点奇怪。您使用 tr[@class="odd"]/td/td 但是一个 td 元素没有另一个 td 作为其子元素。如果您想避免标题更改您的提取,如下面的代码所示。通过此更改,我将在 salary 列表中获得结果。

    import scrapy
    from scrapy.crawler import CrawlerProcess
    
    class crawl_income(scrapy.Spider):
    
        name = "salary"
        allowed_domains = ["stats.mom.gov.sg"]
        start_urls = ['http://stats.mom.gov.sg/Pages/Income-Summary-Table.aspx']
    
        def parse(self, response):
            print response.body
            table_headers = response.xpath('//tr[@class="odd"]//td')
            salary = []
            for value in table_headers[1:]:
                data = value.xpath('./text()').extract()
                salary.append(data)
            print salary
    
    process = CrawlerProcess()
    process.crawl(crawl_income)
    
    process.start()
    

    【讨论】:

    • 不管是start_urls还是url,也不是parse或parse_data,它适用于我的其他爬虫。
    • 好的,我再次查看了代码和站点并更新了示例。但是对我来说,它只适用于start_urls。您是否正确缩进了代码以将 parse 方法放在类的主体中,而不是作为全局方法?
    • 谢谢!它运作良好!知道如何同时执行多个爬虫吗?
    • 如果它有效,我希望你能接受答案。对于多个爬虫,只需使用蜘蛛类多次调用process.crawl
    • 有什么例子吗?在一个类中,我想运行多个蜘蛛。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多