【问题标题】:Include original URL from Excel sheet in scrapy output在 scrapy 输出中包含来自 Excel 工作表的原始 URL
【发布时间】:2020-02-03 13:23:08
【问题描述】:

我正在使用 Scrapy 抓取一些页面。我参考了 start_urls 的 Excel 表,我希望那些 exact 起始 url 出现在结果中,而不是重定向的 url。我需要原件才能处理 Excel 查找。

问题是我似乎只能得到一个给出目标 url 的输出。

我的代码如下;

from scrapy.spiders import Spider
from scrapy.selector import Selector
from ICcom5.items import ICcom5Item
from scrapy.linkextractors import LinkExtractor
from scrapy.utils.response import get_base_url
from scrapy.spiders import CSVFeedSpider
from scrapy.http import Request
from scrapy.loader import ItemLoader
from scrapy.item import Item, Field
import requests
import csv
import sys

class MySpider(Spider):
    name = "ICcom5"
    start_urls = [l.strip() for l in open('items5.csv').readlines()]

    def parse(self, response):
        item = Item()
        titles = response.xpath('//div[@class="jobsearch-JobMetadataFooter"]')
        items = []
        for titles in titles:
            item = ICcom5Item()
            home_url = ("http://www.indeed.co.uk")
            item ['_pageURL'] = response.request.url
            item ['description'] = ' '.join(titles.xpath('//div[@class="jobsearch-jobDescriptionText"]//text()').extract())
            item ['role_title_link'] = titles.xpath('//span[@id="originalJobLinkContainer"]/a/@href').extract()
            items.append(item)
        return items

相当简单的代码,但我很难理解我可以从 Scrapy 文档中做什么。


我已根据建议修改了代码,但仍未从源电子表格中获取原始网址。示例网址如下;

https://www.indeed.co.uk/rc/clk?jk=a47eb72131f3d588&fccid=c7414b794cb89c1c&vjs=3
https://www.indeed.co.uk/rc/clk?jk=8c7f045caddb116d&fccid=473601b0f30a6c9c&vjs=3
https://www.indeed.co.uk/company/Agilysts-Limited/jobs/Back-End-Java-Developer-3ec6efc3ebc256c5?fccid=d1f7896a8bd9f15e&vjs=3

【问题讨论】:

    标签: python scrapy export-to-csv


    【解决方案1】:

    您可以在parse 函数中使用response.request.url 来获取您请求的原始网址。

    更新:我要么理解the documentation 错误,要么这是一个错误。具体

    HTTP 重定向将导致原始请求(重定向前的 URL)分配给重定向的响应(重定向后的最终 URL)

    让我真的觉得原来的请求 URL 应该在 response.request.url 下可用。

    无论如何,正如RedirectMiddleware documentation 中所述,还有另一种方法。您可以使用 request.metaredirect_urls 键来获取请求通过的 URL 列表。因此,这是您的代码的修改(简化)版本作为 PoC:

    # -*- coding: utf-8 -*-
    import scrapy
    
    class MySpider(scrapy.Spider):
        name = 'myspider'
        start_urls = [
            'https://www.indeed.co.uk/rc/clk?jk=a47eb72131f3d588&fccid=c7414b794cb89c1c&vjs=3',
            'https://www.indeed.co.uk/rc/clk?jk=8c7f045caddb116d&fccid=473601b0f30a6c9c&vjs=3',
            'https://www.indeed.co.uk/company/Agilysts-Limited/jobs/Back-End-Java-Developer-3ec6efc3ebc256c5?fccid=d1f7896a8bd9f15e&vjs=3'
        ]
    
        def parse(self, response):
            for title in response.xpath('//div[@class="jobsearch-JobMetadataFooter"]'):
                item = {}
                redirect_urls = response.request.meta.get('redirect_urls')
                item['_pageURL'] = redirect_urls[0] if redirect_urls else response.request.url
                item['description'] = ' '.join(title.xpath('//div[@class="jobsearch-jobDescriptionText"]//text()').extract())
                item['role_title_link'] = title.xpath('//span[@id="originalJobLinkContainer"]/a/@href').extract()
                yield item
    

    另外,请注意您提供的原始代码还存在一些其他问题,特别是:

    • 在您的parse 方法中,您将返回items,这是一个list,但只允许dict(或ItemRequest
    • for titles in titles: 行可能做了一些你不打算做的事情

    【讨论】:

    • 感谢 Tomáš,但是,我按照您的指示修改了代码,但我的抓取仍然返回重定向的 url,而不是源电子表格中的 url。我将item ['_pageURL'] = start.urls 更改为item ['_pageURL'] = response.request.url。对吗?
    • 没错。还有一个documentation 也可以使用它。我经常使用它并按预期工作。我怀疑其他问题。你能分享完整的代码和至少一个sn-p(一个或两个)导致问题的URL吗?
    • 嗨,Tomáš。我修改了原始问题中的代码以反映完整的脚本,并添加了一些最近的 url 示例。感谢您的帮助。
    • 感谢您对 Tomáš 的坚持不懈,您的编码建议奏效了。非常有帮助。我将发布我的最终代码,以便其他人可以看到与我原来的不同之处。
    【解决方案2】:

    这是我最终的工作代码,在 Tomáš Linhart 的帮助下

    class MySpider(Spider):
        name = "ICcom5"
        start_urls = [l.strip() for l in open('items5.csv').readlines()]
        def parse(self, response):
            item = Item()
    
            for titles in response.xpath('//div[@class="jobsearch-JobMetadataFooter"]'):
                items = []
                item = ICcom5Item()
                redirect_urls = response.request.meta.get('redirect_urls')
                item['_pageURL'] = redirect_urls[0] if redirect_urls else response.request.url
                item ['description'] = ' '.join(titles.xpath('//div[@class="jobsearch-jobDescriptionText"]//text()').extract())
                item ['role_title_link'] = titles.xpath('//span[@id="originalJobLinkContainer"]/a/@href').extract()
    
                items.append(item)
            return items
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      相关资源
      最近更新 更多