Включить исходный URL из листа Excel в вывод Scrapy - PullRequest
0 голосов
/ 03 февраля 2020

Я использую Scrapy для сканирования некоторых страниц. Я ссылаюсь на таблицу Excel для start_urls и хочу, чтобы эти точные начальные 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.


Я изменил код в соответствии с рекомендациями, но я все еще я не получаю исходные URL из моей исходной таблицы. Примеры 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

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Вот мой последний рабочий код, с помощью Томаша Линхарта

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
0 голосов
/ 04 февраля 2020

Вы можете использовать response.request.url в функции parse, чтобы получить исходный URL, который вы запросили.

ОБНОВЛЕНИЕ: Я понимаю, что документация неверна или это ошибка В частности,

перенаправления HTTP приведут к тому, что исходный запрос (к URL-адресу до перенаправления) будет назначен перенаправленному ответу (с последним URL-адресом после перенаправления)

делает меня действительно думаю, что исходный URL запроса должен быть доступен в response.request.url.

В любом случае, как указано в RedirectMiddleware документации , есть альтернативный способ. Вы можете использовать redirect_urls ключ request.meta, чтобы получить список URL-адресов, по которым проходит запрос. Итак, вот измененная (упрощенная) версия вашего кода в виде Po C:

# -*- 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: вероятно делает то, что вы не собирались
...