在 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.meta
的 redirect_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
(或 Item
或 Request
)
- 行
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
我正在使用 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.meta
的 redirect_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
(或Item
或Request
) - 行
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