Python 将Excel工作表中的原始URL包含在剪贴输出中

Python 将Excel工作表中的原始URL包含在剪贴输出中,python,scrapy,export-to-csv,Python,Scrapy,Export To Csv,我正在用Scrapy抓取一些页面。我参考了excel表格中的开始URL,我希望这些精确的开始URL出现在结果中,而不是重定向的URL。我需要原件以便处理Excel查找 问题是,我似乎只能得到一个输出,它给出了目标url 我的代码如下 from scrapy.spiders import Spider from scrapy.selector import Selector from ICcom5.items import ICcom5Item from scrapy.linkextractors

我正在用Scrapy抓取一些页面。我参考了excel表格中的开始URL,我希望这些精确的开始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
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
非常简单的代码,但我很难理解我能从这些残缺的文档中做些什么


我已经根据建议修改了代码,但仍然无法从源电子表格中获得原始URL。示例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
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

更新:我要么理解错误,要么是错误。具体地

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

我真的认为原始请求URL应该在
response.request.URL
下可用

不管怎么说,正如书中所说,还有另一种方法。您可以使用
request.meta的
redirect\uURL
键来获取请求经过的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
    方法中,返回
    ,这是一个
    列表
    ,但只允许
    dict
    (或
    请求
  • 标题中标题的
    行:
    可能做了您不想做的事情

    • 这是我在汤姆·亚什·林哈特的帮助下最后的工作代码

      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
      

      不过,感谢Tomáš,我按照您的指示修改了代码,我的scrap仍然返回重定向的url,而不是源电子表格中的url。我将行
      item[''u pageURL']=start.url
      更改为
      item['u pageURL']=response.request.url
      。是吗?没错。使用这个也有一个好办法。我经常使用它,并按预期工作。我怀疑还有其他问题。你能分享完整的代码和至少一段(一个或两个)导致问题的URL吗?嗨,Tomáš。我修改了原始问题中的代码,以反映完整的脚本,并添加了一些最近的URL示例。谢谢你的帮助。谢谢你坚持不懈的Tomáš,你的编码建议奏效了。非常有用。我将发布我的最终代码,以便其他人可以看到与我的原始代码的差异。