使用scrapy

时间:2018-06-19 03:18:47

标签: python web-scraping scrapy

我是使用scrapy进行网络抓取的新手。我想抓一个网站(请参阅代码中的网址)。 从网站上,我试图废弃“Intimation For%Month %% Year%”表中的信息,并将数据传输到json文件。

  

我收到错误,因为“'NoneType'对象不可迭代”,执行命令时出现错误:

     
    

scrapy抓取引号-o quotes.json

  

代码:

import scrapy
class QuotesSpider(scrapy.Spider):
  name = "quotes"

def start_requests(self):
    urls = [
       'http://www.narakkalkuries.com/intimation.html#i'
    ]

def parse(self, response):
  for check in response.xpath('//table[@class="MsoTableGrid"]'):
    yield{
           'data':check.xpath('//table[@class="MsoTableGrid"]/tr/td/p/b//text()').extract_first()
         }

问题: 在网站上,所有的评价数据都存储在同名的表格中 table @ class =“MsoTableGrid”

选项我尝试提取数据

  

选项1

     
    

response.xpath('//table[@class="MsoTableGrid"]').extract()

         
      

返回所有数据

    
  
     

1选项

     
    

response.xpath('//table[@class="MsoTableGrid"]/tr[i]/td/p/b').extract()

         
      

返回几个垂直列

    
  
     

2选项

     
    

response.xpath('//table[@class="MsoTableGrid"]/tr/td/p/b//text()').extract()[1]

         
      

从整个数据中返回第一个元素

    
  

问题:

  • 使用Option3时,是否可以知道返回的元素是否为字符串?
  • 使用Option3时,是否可以知道返回的整个数据范围,以便我们可以遍历每个返回的元素?
  • 如何修复错误“NoneType”对象不可迭代“

2 个答案:

答案 0 :(得分:1)

import scrapy


class QuotesSpider(scrapy.Spider):
  name = "quotes"

def start_requests(self):
    urls = [
       'http://www.narakkalkuries.com/intimation.html#i'
    ]

    # Here you need to yield the scrapy.Request
    for url in urls:
        yield scrapy.Request(url)

def parse(self, response):
  for check in response.xpath('//table[@class="MsoTableGrid"]'):
    yield{
           'data':check.xpath('//table[@class="MsoTableGrid"]/tr/td/p/b//text()').extract_first()
         }

答案 1 :(得分:1)

要添加start_requests,预计会成为scrapy.Request个对象的生成器。您的start_requests不会产生任何结果:

def start_requests(self):
    urls = [
       'http://www.narakkalkuries.com/intimation.html#i'
    ]

要修复此问题,请在start_requests方法中逐一生成网址:

def start_requests(self):
    urls = [
       'http://www.narakkalkuries.com/intimation.html#i'
    ]
    for url in urls:
        yield Requst(url)

或者仅使用设置start_requests类属性,使用从scrapy.Spider继承的默认start_urls方法:

import scrapy
class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://www.narakkalkuries.com/intimation.html#i'
    ]