Как передать информацию от одного метода к другому в scrapy - PullRequest
0 голосов
/ 08 мая 2020

Я собираю данные с веб-сайта, который требует от меня получения данных из индивидуальных профилей кандидатов. Уловка в том, что часть данных должна быть извлечена из фрагмента профиля, а остальная часть должна быть извлечена после входа в профиль.

Поля, которые должны быть извлечены с помощью фрагмента: 1. Работа Авторизация 2. Имя кандидата 3. Идентификатор изображения

Остальные данные могут быть извлечены после открытия профиля.

Проблема:

Я написал паука и хочу передавать данные вышеперечисленных полей из одного метода в другой. Теперь, когда я сканирую своего паука, я получаю данные этих трех полей, повторяющиеся для всех профилей кандидатов на определенной странице. На самом деле я новичок в веб-парсинге и python. Не могли бы вы мне помочь?

Я прилагаю свой код паука и файл items.py для справки:

import scrapy
from urllib.parse import urljoin
from hbs_candidates.items import HbsCandidatesItem

domain = 'https://www.myvisajobs.com'
url = 'https://www.myvisajobs.com/CV/Search.aspx?DG=Bachelor&P=1'
page_scraped = 2
classes = ['HighLight: ', 'Membership: ', 'Honor: ', 'Skills: ', 'Degree: ', 'Career Level: ', 'Certification: ','Occupation: ', 'Reference: ', 'Target Locations: ', 'Career Title: ', 'Goal: ', 'Target Title:']


class InfoSpider(scrapy.Spider):
    name = 'inform'
    start_urls = [url]
    # page_no = 1

    def parse(self, response):
        wa_temp = []
        items = HbsCandidatesItem()
        tables = response.xpath("""//*[@id="ctl00_ctl00_ContentPlaceHolder1_ContentPlaceHolder1_divContent"]/center/table/tr""")
        names_temp = tables.css('b a::text').extract()
        images_temp = [domain + x for x in response.css('img::attr(src)').extract()[1:]]
        for i in range(len(tables)):
            wa = str(tables.xpath("""//*[@id="ctl00_ctl00_ContentPlaceHolder1_ContentPlaceHolder1_divContent"]/center/table/tr[3]/td[2]/text()[6]""").extract()).split('Work Authorization: ')[1]
            if wa is not None:
                temp_wa = wa
            else:
                temp_wa = 'N/A'
            wa_temp.append(temp_wa)
        my_list = response.css('b a::attr(href)').extract()
        for i in range(len(my_list)):
            url_final = urljoin(url, my_list[i])
            temp_url = response.urljoin(url_final)
            items['Candidate Name'] = names_temp[i]
            items['Image ID'] = images_temp[i]
            items['Work Authorization'] = wa_temp[i]
            request = scrapy.Request(temp_url, callback=self.parse_can_contents)
            request.cb_kwargs['items'] = items
            yield request

    def parse_can_contents(self, response, items):
        ### code to scrape data from profile page and assigning values to 
        items
        -----------
        -------------

        ## I want to access the values passed from parse method here    
        yield items

Код items.py:

from scrapy.item import Item, Field


class HbsCandidatesItem(Item):
    def __setitem__(self, key, value):
        if key not in self.fields:
            self.fields[key] = Field()
        self._values[key] = value

Надеюсь, это понятно. Пожалуйста, спросите, если вопрос кажется неоднозначным. Спасибо!

1 Ответ

0 голосов
/ 08 мая 2020

Элементы (items = HbsCandidatesItem ()) должны быть созданы внутри for l oop

for i in range(len(my_list)):
        url_final = urljoin(url, my_list[i])
        temp_url = response.urljoin(url_final)
        items = HbsCandidatesItem()
        items['Candidate Name'] = names_temp[i]
        items['Image ID'] = images_temp[i]
        items['Work Authorization'] = wa_temp[i]
        request = scrapy.Request(temp_url, callback=self.parse_can_contents)
        request.cb_kwargs['items'] = items
        yield request
...