【问题标题】:Scrapy: Extracting data from source and its linksScrapy:从源及其链接中提取数据
【发布时间】:2016-05-17 09:36:19
【问题描述】:

已编辑问题以链接到原始问题:

Scrapy getting data from links within table

来自链接https://www.tdcj.state.tx.us/death_row/dr_info/trottiewillielast.html

我正在尝试从主表以及表中其他 2 个链接中的数据获取信息。我设法从一个中提取,但问题是转到另一个链接并将数据附加到一行中。

from urlparse import urljoin

import scrapy

from texasdeath.items import DeathItem

class DeathItem(Item):
    firstName = Field()
    lastName = Field()
    Age = Field()
    Date = Field()
    Race = Field()
    County = Field()
    Message = Field()
    Passage = Field()

class DeathSpider(scrapy.Spider):
    name = "death"
    allowed_domains = ["tdcj.state.tx.us"]
    start_urls = [
        "http://www.tdcj.state.tx.us/death_row/dr_executed_offenders.html"
    ]

    def parse(self, response):
        sites = response.xpath('//table/tbody/tr')
        for site in sites:
            item = DeathItem()

            item['firstName'] = site.xpath('td[5]/text()').extract()
            item['lastName'] = site.xpath('td[4]/text()').extract()
            item['Age'] = site.xpath('td[7]/text()').extract()
            item['Date'] = site.xpath('td[8]/text()').extract()
            item['Race'] = site.xpath('td[9]/text()').extract()
            item['County'] = site.xpath('td[10]/text()').extract()

            url = urljoin(response.url, site.xpath("td[3]/a/@href").extract_first())
            url2 = urljoin(response.url, site.xpath("td[2]/a/@href").extract_first())
            if url.endswith("html"):
                request = scrapy.Request(url, meta={"item": item,"url2" : url2}, callback=self.parse_details)
                yield request
            else:
                yield item
def parse_details(self, response):
    item = response.meta["item"]
    url2 = response.meta["url2"]
    item['Message'] = response.xpath("//p[contains(text(), 'Last Statement')]/following-sibling::p/text()").extract()
    request = scrapy.Request(url2, meta={"item": item}, callback=self.parse_details2)
    return request

def parse_details2(self, response):
    item = response.meta["item"]
    item['Passage'] = response.xpath("//p/text()").extract_first()
    return item

我了解我们如何将参数传递给请求和元数据。但是仍然不清楚流程,在这一点上我不确定这是否可能。我查看了几个示例,包括以下示例:

using scrapy extracting data inside links

How can i use multiple requests and pass items in between them in scrapy python

从技术上讲,数据将反映主表,其中两个链接都包含来自其链接内的数据。

感谢任何帮助或指导。

【问题讨论】:

    标签: python xpath scrapy scrapy-spider


    【解决方案1】:

    本例的问题出在这段代码中

    if url.endswith("html"):
            yield scrapy.Request(url, meta={"item": item}, callback=self.parse_details)
        else:
            yield item
    
    if url2.endswith("html"):
            yield scrapy.Request(url2, meta={"item": item}, callback=self.parse_details2)
        else:
            yield item
    

    通过请求链接,您正在创建一个新的“线程”,该线程将拥有自己的生命周期,因此,函数 parse_details 将无法看到 parse_details2 中正在执行的操作,我会这样做的方式是在其中调用一个互相这样

    url = urljoin(response.url, site.xpath("td[2]/a/@href").extract_first())
    
    url2 = urljoin(response.url, site.xpath("td[3]/a/@href").extract_first()
    
    if url.endswith("html"):
        request=scrapy.Request(url, callback=self.parse_details)
        request.meta['item']=item
        request.meta['url2']=url2
        yield request
    elif url2.endswith("html"):
        request=scrapy.Request(url2, callback=self.parse_details2)
        request.meta['item']=item
        yield request
    
    else:
        yield item
    
    
    def parse_details(self, response):
        item = response.meta["item"]
        url2 = response.meta["url2"]
        item['About Me'] = response.xpath("//p[contains(text(), 'About Me')]/following-sibling::p/text()").extract()
        if url2:
            request=scrapy.Request(url2, callback=self.parse_details2)
            request.meta['item']=item
            yield request
        else:
            yield item
    

    此代码尚未经过彻底测试,因此请在测试时发表评论

    【讨论】:

    • url2 = response.meta("url2") TypeError: 'dict' object is not callable 出现某种错误。可能是我们传递 response.meta 的方式。
    • 应该是因为我们访问字典的方式。
    • 更新了我的代码并链接到我原来的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2016-01-23
    相关资源
    最近更新 更多