在 scrapy 输出中包含来自 Excel sheet 的原始 URL

Include original URL from Excel sheet in scrapy output

我正在使用 Scrapy 来抓取一些页面。我为 start_urls 引用了 excel sheet,我希望那些 exact 开始的 urls 出现在结果中,而不是重定向的 urls。我需要原件才能处理 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 文档中做什么。


我已经根据建议修改了代码,但我仍然没有从我的源传播sheet中得到原始的urls。例子url如下;

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

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

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

HTTP redirections will cause the original request (to the URL before redirection) to be assigned to the redirected response (with the final URL after redirection)

让我真的认为原始请求 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áš 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