【问题标题】:how to scrape data from multiple pages in the same csv row?如何从同一csv行中的多个页面中抓取数据?
【发布时间】:2017-03-29 23:35:47
【问题描述】:

我需要从多个页面中抓取数据。首先它应该从第一页抓取数据,然后从这个页面提取一个到第二页的 url 并从中获取一些数据

所有内容都应位于同一 csv 行。

这是第一页: https://www.catalogs.ssg.asia/toyota/?fromchanged=true&lang=en&l=bWFya2V0PT1nZW5lcmFsfHxzdD09MjB8fHN0cz09eyIxMCI6IlJlZ2lvbiIsIjIwIjoiTWlkZGxlIEVhc3QifQ%3D%3D

数据示例是表格的第一行,例如:目录、型号、生产和系列。

这是第二页: https://www.catalogs.ssg.asia/toyota/?fromchanged=true&lang=en&l=bWFya2V0PT1nZW5lcmFsfHxzdD09MzB8fHN0cz09eyIxMCI6IlJlZ2lvbiIsIjIwIjoiTWlkZGxlIEVhc3QiLCIzMCI6IjRSVU5ORVIgNjcxMzYwIn18fGNhdGFsb2c9PTY3MTM2MHx8cmVjPT1CMw%3D%3D 数据示例:系列、发动机、生产日期。

两者应该在同一个 csv 行中,如屏幕截图所示:

这是我的代码:

import datetime
import urlparse
import socket
import scrapy

from scrapy.loader.processors import MapCompose, Join
from scrapy.loader import ItemLoader
from scrapy.http import Request

from properties.items import PropertiesItem


class BasicSpider(scrapy.Spider):
    name = "manual"


    # This is the page which i will hit middle est from.
    start_urls = ["https://www.catalogs.ssg.asia/toyota/?fromchanged=true&lang=en"]


    def parse(self, response):
        # First page
        next_selector ="https://www.catalogs.ssg.asia/toyota/?fromchanged=true&lang=en&l="+response.xpath('//*[@id="rows"]/tr[2]/@onclick').re(r"HM\.set\('([^']+)'")[0]
        yield Request(next_selector, callback=self.parse_item)

    def parse_item(self, response):
        for tr in response.xpath("/html/body/table[2]/tr/td/table/tr")[1:]:
            item = PropertiesItem()

            item['Series']= tr.xpath("td[1]/text()").extract()
            item['Engine']= tr.xpath("td[2]/text()").extract()
            second_selector ="https://www.catalogs.ssg.asia/toyota/?fromchanged=true&lang=en&l="+response.xpath('/html/body/table[2]/tr/td/table/tr/@onclick').re(r"HM\.set\('([^']+)'")

            yield item

    def parse_item_2(self, response):
        item = PropertiesItem()
        item['Building_Condition']=response.xpath('/html/body/table[2]/tr/td/table/tr[2]/td[1]/text()').extract()
        yield item

我需要在 parse item 中编写一些代码以转到 parse_item_2 并处理第二页并将结果放在同一 csv 行上。 该怎么做?

【问题讨论】:

    标签: python scrapy scrapy-spider


    【解决方案1】:

    如果您想使用来自不同 url 的数据构建单个项目,您应该使用元属性将其从一个请求对象传递到下一个对象。最后,您生成结果项以便将其写入单行。

    def parse_item(self, response):
        for tr in response.xpath("/html/body/table[2]/tr/td/table/tr")[1:]:
            [...]
            second_selector = [...]
            meta = {'item': item}
            yield Request(second_selector, meta=meta, callback=self.parse_item_2)
    
        def parse_item_2(self, response):
            item = PropertiesItem(response.meta['item'])
            item['Building_Condition']=response.xpath('/html/body/table[2]/tr/td/table/tr[2]/td[1]/text()').extract()
            yield item
    

    【讨论】:

      猜你喜欢
      • 2021-07-12
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多