尝试使用scrapy爬行值

时间:2015-07-14 08:07:23

标签: python web-crawler scrapy

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

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()

但是当我尝试打印出我创建的用于存储值的列表时,我看不到任何值。

我哪里出错了?

1 个答案:

答案 0 :(得分:3)

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

url应为start_urls,让Scrapy知道从何处开始抓取。

parse_data应为parse,因为没有任何信息,Scrapy不知道要调用哪种方法,默认值为parse。否则,当Scrapy抓取起始网址并且NotImplementedError方法不存在时,您也会获得parse

当我运行下面的代码(包含所有提到的更改)并将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()