Python 将Excel工作表中的原始URL包含在剪贴输出中
我正在用Scrapy抓取一些页面。我参考了excel表格中的开始URL,我希望这些精确的开始URL出现在结果中,而不是重定向的URL。我需要原件以便处理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
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áš,你的编码建议奏效了。非常有用。我将发布我的最终代码,以便其他人可以看到与我的原始代码的差异。