Как передать данные из одного класса в класс Scrapy - PullRequest
0 голосов
/ 17 апреля 2020

Мне нужно передать URL-адрес, имя пользователя и пароль из одного класса в класс Scrapy, чтобы выполнить очистку веб-страниц.

import quotes as q
import scrapy
from scrapy.crawler import CrawlerProcess
class ValidateURL:
    def checkURL(self,urls):
        try:    
            if(urls):
                for key, value in urls.items():
                    if value['login_details']:
                        self.runScrap(value)                                                      
        except:
            return False

    def runScrap(self,data):       
            if data:
               ''' data= "url_4": {
                                                "url": ("https://quotes.toscrape.com/login",),
                                                "fields_in_response": ["Quotes to Scrape","Login"],
                                                "login_details": {"name":"foobar","pwd":"foobar" },
                                                "fields_in_main_page": ["Quotes to Scrape","Top Ten tags"]
                                }

               '''
               process = CrawlerProcess()
               process.crawl(q.QuotesSpider, start_urls=data['url'])
               process.start()

И класс Scrapy

# -*- coding: utf-8 -*-
from scrapy import Spider
from scrapy.http import FormRequest
from scrapy.utils.response import open_in_browser
import sys
import logging
from bs4 import BeautifulSoup
# import scrapy
# from scrapy.crawler import CrawlerProcess

logging.basicConfig(filename='app.log',level=logging.INFO)

class QuotesSpider(Spider):
    name = 'quotes'
    start_urls = ('https://quotes.toscrape.com/login',)



    def parse(self, response):
        # print(self.req['url'])
        print('/'*100)
        self.start_urls=self.login_url
        # print(type(self.login_url))
        inputs =response.xpath('//form//input').extract()
        soup_dict={}
        for key,i in enumerate(inputs):
            soup = BeautifulSoup(i, 'html.parser')
            inp_type   =   soup.input['type'] if soup.input.has_attr('type') else None
            inp_value  =   soup.input['value'] if soup.input.has_attr('value')  else None
            inp_name   =   soup.input['name'] if soup.input.has_attr('name')  else None
            soup_dict[key]= {'name':inp_name,'value':inp_value,'type':inp_type}  
        token = response.xpath('//*[@name="csrf_token"]/@value').extract_first()
        return FormRequest.from_response(response,
                                         formdata={'csrf_token': token,
                                                   'password': 'foobar',
                                                   'username': 'foobar'},
                                         callback=self.scrape_pages)

    def fetch_form_data(self,response):

        if all(field in response for field in self.fields_in_response):
            inputs =response.xpath('//form//input').extract()
            soup_dict={}
            for key,i in enumerate(inputs):
                soup = BeautifulSoup(i, 'html.parser')
                inp_type   =   soup.input['type'] if soup.input.has_attr('type') else None
                inp_value  =   soup.input['value'] if soup.input.has_attr('value')  else None
                inp_name   =   soup.input['name'] if soup.input.has_attr('name')  else None
                soup_dict[key]= {'name':inp_name,'value':inp_value,'type':inp_type}  


    def scrape_pages(self, response):
        open_in_browser(response)

        # Complete your code here to scrape the pages that you are redirected to after logging in

        # ....
        # ....


Однако Я не могу обновить переменную класса start_urls. с переданной переменной из класса ValidateURL. Я попытался с init в классе QuotesSpider, но это не сработало. На самом деле start_urls является членом класса BaseClass (Spider). Могут ли некоторые помочь мне узнать, как обновить переменную класса baseclass

Может кто-нибудь подсказать, чего не хватает

1 Ответ

1 голос
/ 18 апреля 2020

Вы можете передать параметры Пауку из команды сканирования, как это

process.crawl(q.QuotesSpider, first='James', last='Bond')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...