Scrapy FormRequest вход в imdb с использованием поля формы javascript - PullRequest
0 голосов
/ 05 мая 2020

У меня есть URL-адрес списка imdb, который я хочу проанализировать. Я говорю это как base_url. Я много искал в Интернете, но не нашел никого, кто смог бы войти в imdb. Вероятно, из-за почти 10 элементов, необходимых в FormRequest formdata или какой-то другой сложности. Мне нужно войти в imdb перед анализом, который вообще не работает. Я понимаю и твердо уверен, что в этом коде есть несколько ошибок, которые появятся после исправления текущей активной ошибки, поэтому, пожалуйста, проявите терпение в отношении решения этой проблемы. Вот что у меня есть и что мне дает терминал;

Начальный код выглядит следующим образом, он говорит [если вы вошли в систему, то выполните синтаксический анализ base_url, иначе выполните синтаксический анализ для входа в систему.

import scrapy
from scrapy.http import FormRequest


class lisTopSpider(scrapy.Spider):
    name= 'imdbLog'
    allowed_domains = ['imdb.com']
    start_urls = [
        'https://www.imdb.com/ap/signin?openid.pape.max_auth_age=0&openid.return_to=https://www.imdb.com/registration/ap-signin-handler/imdb_us&openid.identity=http://specs.openid.net/auth/2.0/identifier_select&openid.assoc_handle=imdb_us&openid.mode=checkid_setup&siteState=eyJvcGVuaWQuYXNzb2NfaGFuZGxlIjoiaW1kYl91cyIsInJlZGlyZWN0VG8iOiJodHRwczovL3d3dy5pbWRiLmNvbS8_cmVmXz1sb2dpbiJ9&openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select&openid.ns=http://specs.openid.net/auth/2.0&tag=imdbtag_reg-20'
    ]

    def parse(self, response):
        token = response.xpath('//form/input[@name="appActionToken"]/@value').get()
        appAction = response.xpath('//form/input[@name="appAction"]/@value').get()
        siteState = response.xpath('//form/input[@name="siteState"]/@value').get()
        openid = response.xpath('//form/input[@name="openid.return_to"]/@value').get() 
        prevRID = response.xpath('//form/input[@name="prevRID"]/@value').get()
        workflowState = response.xpath('//form/input[@name="workflowState"]/@value').get() 
        create = response.xpath('//input[@name="create"]/@value').get() 
        metadata1 = response.xpath('//input[@name="metadata1"]/@value').get()

        base_url = 'https://www.imdb.com/lists/tt0120852'
        if 'login' in response.url:
            return scrapy.Request(base_url, callback = self.listParse)
        else:
            return FormRequest.from_response(response,formdata={
                'appActionToken':token,
                'appAction':appAction,
                'siteState':siteState,
                'openid.return_to':openid,
                'prevRID':prevRID,
                'workflowState':workflowState,
                'email':'.......@.....com',
                'create':create,
                'passwrod':'........',
                'metadata1':metadata1
                },callback=self.parse)

Далее У меня есть тестовый код печати следующим образом:

#Test Prints
        print('token:'+token)
        print('appAction:'+appAction)
        print('siteState:'+siteState)
        print('openId:'+openid) 
        print('prevRID:'+prevRID)
        print('workflowState:'+workflowState)
        print('create:'+create)
        print(metadata1)

При тестировании результатов печати в терминале VSCode:

token:scIhj2FOCtxr39z7eUIj2FWeNOWxtIwj3D
appAction:SIGNIN
siteState:ape:ZXlKdmNHVnVhV1F1WVhOemIyTmZhR0Z1Wkd4bElqb2lhVzFrWWw5MWN5SXNJbkpsWkdseVpXTjBWRzhpT2lKb2RIUndjem92TDNkM2R5NXBiV1JpTG1OdmJTOF9jbVZtWHoxc2IyZHBiaUo5
openId:ape:aHR0cHM6Ly93d3cuaW1kYi5jb20vcmVnaXN0cmF0aW9uL2FwLXNpZ25pbi1oYW5kbGVyL2ltZGJfdXM=
prevRID:ape:Qzk5NEUwNjJLOFBSUzVHQktUQ1c=
workflowState:eyJ6aXAiOiJERUYiLCJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiQTI1NktXIn0.r2wu9Fca1h4JT_iSzKWG4FT_F6SxlriABvmYnEdAKpkSdMYGVZbJNw.HdQghAIsJKttKgLN.jS-NSMh66f7pBmcLN07pzHwgz2oc1D2SWGntJUxY1yqNl9PT2v7BDCP-A3p4ao7_TBjJXrJuhZo3Az8DKd2GKS77TPDM8e1FLtaAUEYzzlpoTD7D9dTie-E0ig1h9TNqSniyKs9NMuufKscAqKixn9tArddoMqhAuzpOAvFV9CmRLG5AYnonPSBTE4GgST7BQ3l6IpMMRCaTGJMofGwbhzyYwtEJJkIl5zMx47wrgILy6QO9SL0z-zPbMCCtzZ-75gwd-UeuF5h7wSSR3_UaQjtWaxBaShHVTpP5DvuT.E_coQgOJ93WNKJvv53n3bw
create:0
None

Ниже приведен код, который предполагается использовать для анализа base_url после успешного входа в систему.

def listParse(self, response):
        listsLinks = response.xpath('//div[2]/strong')
        for link in listsLinks:
            list_url = response.urljoin(link.xpath('.//a/@href').get())
            yield scrapy.Request(list_url, callback=self.parse_list, meta={'list_url': list_url})

        next_page_url = response.xpath('//a[@class="flat-button next-page "]/@href').get()
        if next_page_url is not None:
            next_page_url = response.urljoin(next_page_url)
        yield scrapy.Request(next_page_url, callback=self.listParse)            

    #Link of each list
    def parse_list(self, response):
        list_url = response.meta['list_url']
        myRatings = response.xpath('//div[@class="ipl-rating-star small"]/span[2]/text()').getall()

        yield{
            'list': list_url,
            'ratings': myRatings,
        }

У меня много типов терминальных сообщений. Каждый раз, когда я меняю код, я получаю другую терминальную ошибку, например, отсутствие элемента формы et c. В настоящее время я получаю новую ошибку терминала. Соответствующий раздел выглядит следующим образом:

2020-05-05 15:31:56 [scrapy.core.engine] DEBUG: Crawled (200) <POST https://www.imdb.com/ap/signin> (referer: https://www.imdb.com/ap/signin?openid.pape.max_auth_age=0&openid.return_to=https://www.imdb.com/registration/ap-signin-handler/imdb_us&openid.identity=http://specs.openid.net/auth/2.0/identifier_select&openid.assoc_handle=imdb_us&openid.mode=checkid_setup&siteState=eyJvcGVuaWQuYXNzb2NfaGFuZGxlIjoiaW1kYl91cyIsInJlZGlyZWN0VG8iOiJodHRwczovL3d3dy5pbWRiLmNvbS8_cmVmXz1sb2dpbiJ9&openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select&openid.ns=http://specs.openid.net/auth/2.0&tag=imdbtag_reg-20)
2020-05-05 15:31:56 [scrapy.core.scraper] ERROR: Spider error processing <POST https://www.imdb.com/ap/signin> (referer: https://www.imdb.com/ap/signin?openid.pape.max_auth_age=0&openid.return_to=https://www.imdb.com/registration/ap-signin-handler/imdb_us&openid.identity=http://specs.openid.net/auth/2.0/identifier_select&openid.assoc_handle=imdb_us&openid.mode=checkid_setup&siteState=eyJvcGVuaWQuYXNzb2NfaGFuZGxlIjoiaW1kYl91cyIsInJlZGlyZWN0VG8iOiJodHRwczovL3d3dy5pbWRiLmNvbS8_cmVmXz1sb2dpbiJ9&openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select&openid.ns=http://specs.openid.net/auth/2.0&tag=imdbtag_reg-20)   
Traceback (most recent call last):
  File "c:\users\abdul\appdata\local\programs\python\python37-32\lib\site-packages\twisted\internet\defer.py", line 654, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "C:\Python Projects\Scrapy\imdbscrappervenv\imdb_project\imdb_project\spiders\Loginner.py", line 23, in parse
    print('token:'+token)
TypeError: can only concatenate str (not "NoneType") to str
2020-05-05 15:31:57 [scrapy.core.engine] INFO: Closing spider (finished)

Пожалуйста, подскажите, что не так с кодом. Спасибо

UPDATE1: конкатенация строки + ошибка Num удалена Я изменил print ('token:' + token) на print (token), поскольку произошла ошибка конкатенации строки + Num. Это решено, и теперь у меня возникает следующая ошибка в терминале:

2020-05-05 16:08:01 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.imdb.com/ap/signin?openid.pape.max_auth_age=0&openid.return_to=https://www.imdb.com/registration/ap-signin-handler/imdb_us&openid.identity=http://specs.openid.net/auth/2.0/identifier_select&openid.assoc_handle=imdb_us&openid.mode=checkid_setup&siteState=eyJvcGVuaWQuYXNzb2NfaGFuZGxlIjoiaW1kYl91cyIsInJlZGlyZWN0VG8iOiJodHRwczovL3d3dy5pbWRiLmNvbS8_cmVmXz1sb2dpbiJ9&openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select&openid.ns=http://specs.openid.net/auth/2.0&tag=imdbtag_reg-20> (referer: None)
2020-05-05 16:08:02 [scrapy.core.engine] DEBUG: Crawled (200) <POST https://www.imdb.com/ap/signin> (referer: https://www.imdb.com/ap/signin?openid.pape.max_auth_age=0&openid.return_to=https://www.imdb.com/registration/ap-signin-handler/imdb_us&openid.identity=http://specs.openid.net/auth/2.0/identifier_select&openid.assoc_handle=imdb_us&openid.mode=checkid_setup&siteState=eyJvcGVuaWQuYXNzb2NfaGFuZGxlIjoiaW1kYl91cyIsInJlZGlyZWN0VG8iOiJodHRwczovL3d3dy5pbWRiLmNvbS8_cmVmXz1sb2dpbiJ9&openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select&openid.ns=http://specs.openid.net/auth/2.0&tag=imdbtag_reg-20)
2020-05-05 16:08:02 [scrapy.core.scraper] ERROR: Spider error processing <POST https://www.imdb.com/ap/signin> (referer: https://www.imdb.com/ap/signin?openid.pape.max_auth_age=0&openid.return_to=https://www.imdb.com/registration/ap-signin-handler/imdb_us&openid.identity=http://specs.openid.net/auth/2.0/identifier_select&openid.assoc_handle=imdb_us&openid.mode=checkid_setup&siteState=eyJvcGVuaWQuYXNzb2NfaGFuZGxlIjoiaW1kYl91cyIsInJlZGlyZWN0VG8iOiJodHRwczovL3d3dy5pbWRiLmNvbS8_cmVmXz1sb2dpbiJ9&openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select&openid.ns=http://specs.openid.net/auth/2.0&tag=imdbtag_reg-20)   
Traceback (most recent call last):
  File "c:\users\abdul\appdata\local\programs\python\python37-32\lib\site-packages\twisted\internet\defer.py", line 654, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "C:\Python Projects\Scrapy\imdbscrappervenv\imdb_project\imdb_project\spiders\Loginner.py", line 37, in parse
    },callback=self.parse)
  File "c:\users\abdul\appdata\local\programs\python\python37-32\lib\site-packages\scrapy\http\request\form.py", line 48, in from_response
    form = _get_form(response, formname, formid, formnumber, formxpath)
  File "c:\users\abdul\appdata\local\programs\python\python37-32\lib\site-packages\scrapy\http\request\form.py", line 83, in _get_form
    raise ValueError("No <form> element found in %s" % response)

ПОЛЕЗНАЯ ИНФОРМАЦИЯ Я попытался запустить страницу входа, отключив javascript, и обнаружил, что один элемент «Метаданные1» был не появляется в инспекции. Означает, что это активированный элемент javascript, поэтому я не могу войти в систему с помощью scrapy? Любой ярлык, если возможно?

...