簡體   English   中英

通過憑據登錄后,Scrapy 不會在 LinkedIn 上抓取數據

[英]Scrapy not crawling data on LinkedIn after login through credentials

我正在嘗試從添加我的linkedin 中的組中抓取成員列表。

雖然當我運行我的代碼時,我沒有得到任何響應/值作為回報。 和大量的錯誤。

我已經驗證了我的 Parse 代碼,它看起來不錯。

這是我的代碼:

import scrapy
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request
from scrapy.http import FormRequest

class LoginSpider(BaseSpider):
    name = 'jiju'
    start_urls = ['https://www.linkedin.com/groups/58888/members']

    def parse(self, response):
        return [FormRequest.from_response(response,
                    formdata={'username': 'myusername', 'password': 'mypassword'},
                    callback=self.after_login)]

    def after_login(self, response):
        # check login succeed before going on
        if "authentication failed" in response.body:
            self.log("Login failed", level=log.ERROR)
            return
        # We've successfully authenticated, let's have some fun!
        else:
            return Request(url="http://www.example.com/tastypage/",
                   callback=self.parse_tastypage)

    def parse_tastypage(self, response):
        for j in response.xpath('//*[@id="ember2299"]'):
            yield {
              'detail':j.xpath('//*[@id="ember2299"]/span').extract(),
        }

這是我得到的回應。

C:\Users\Yash\tutorial\tutorial\spiders\jij.py:1: ScrapyDeprecationWarning: Module `scrapy.contrib.spiders` is deprecated, use `scrapy.spiders` instead
  from scrapy.contrib.spiders.init import InitSpider
C:\Users\Yash\tutorial\tutorial\spiders\jij.py:1: ScrapyDeprecationWarning: Module `scrapy.contrib.spiders.init` is deprecated, use `scrapy.spiders.init` instead
  from scrapy.contrib.spiders.init import InitSpider
C:\Users\Yash\tutorial\tutorial\spiders\jij.py:6: ScrapyDeprecationWarning: Module `scrapy.spider` is deprecated, use `scrapy.spiders` instead
  from scrapy.spider import BaseSpider
C:\Users\Yash\tutorial\tutorial\spiders\jiju.py:7: ScrapyDeprecationWarning: tutorial.spiders.jiju.LoginSpider inherits from deprecated class scrapy.spiders.BaseSpider, please inherit from scrapy.spiders.Spider. (warning only on first subclass, there may be others)
  class LoginSpider(BaseSpider):
2018-08-03 00:51:07 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: tutorial)
2018-08-03 00:51:07 [scrapy.utils.log] INFO: Overridden settings: {'BOT_NAME': 'tutorial', 'NEWSPIDER_MODULE': 'tutorial.spiders', 'SPIDER_MODULES': ['tutorial.spiders']}
2018-08-03 00:51:07 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.logstats.LogStats']
2018-08-03 00:51:07 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
 'scrapy.downloadermiddlewares.stats.DownloaderStats']
2018-08-03 00:51:07 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2018-08-03 00:51:07 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2018-08-03 00:51:07 [scrapy.core.engine] INFO: Spider opened
2018-08-03 00:51:07 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2018-08-03 00:51:07 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2018-08-03 00:51:07 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET https://www.linkedin.com/uas/login?session_redirect=https%3A%2F%2Fwww.linkedin.com%2Fgroups%2F58888%2Fmembers> from <GET https://www.linkedin.com/groups/58888/members>
2018-08-03 00:51:08 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET https://www.linkedin.com/start/join?session_redirect=https%3A%2F%2Fwww.linkedin.com%2Fgroups%2F58888%2Fmembers&trk=login_reg_redirect> from <GET https://www.linkedin.com/uas/login?session_redirect=https%3A%2F%2Fwww.linkedin.com%2Fgroups%2F58888%2Fmembers>
2018-08-03 00:51:08 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.linkedin.com/start/join?session_redirect=https%3A%2F%2Fwww.linkedin.com%2Fgroups%2F58888%2Fmembers&trk=login_reg_redirect> (referer: None)
2018-08-03 00:51:08 [scrapy.core.engine] DEBUG: Crawled (422) <POST https://www.linkedin.com/start/reg/api/createAccount> (referer: https://www.linkedin.com/start/join?session_redirect=https%3A%2F%2Fwww.linkedin.com%2Fgroups%2F58888%2Fmembers&trk=login_reg_redirect)
2018-08-03 00:51:08 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <422 https://www.linkedin.com/start/reg/api/createAccount>: HTTP status code is not handled or not allowed
2018-08-03 00:51:08 [scrapy.core.engine] INFO: Closing spider (finished)
2018-08-03 00:51:08 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 2810,
 'downloader/request_count': 4,
 'downloader/request_method_count/GET': 3,
 'downloader/request_method_count/POST': 1,
 'downloader/response_bytes': 20952,
 'downloader/response_count': 4,
 'downloader/response_status_count/200': 1,
 'downloader/response_status_count/302': 2,
 'downloader/response_status_count/422': 1,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2018, 8, 2, 19, 21, 8, 574170),
 'httperror/response_ignored_count': 1,
 'httperror/response_ignored_status_count/422': 1,
 'log_count/DEBUG': 5,
 'log_count/INFO': 8,
 'request_depth_max': 1,
 'response_received_count': 2,
 'scheduler/dequeued': 4,
 'scheduler/dequeued/memory': 4,
 'scheduler/enqueued': 4,
 'scheduler/enqueued/memory': 4,
 'start_time': datetime.datetime(2018, 8, 2, 19, 21, 7, 742810)}
2018-08-03 00:51:08 [scrapy.core.engine] INFO: Spider closed (finished)

問題:

Scrapy嘗試訪問start_urls ,在您的情況下是: https://www.linkedin.com/groups/58888/members

由於此請求已發出且您尚未登錄, LinkedIn將您重定向到https://www.linkedin.com/start/join ,這是一個用於創建新用戶的頁面。

您的parse函數嘗試在此頁面上查找表單並使用您的憑據設置輸入字段usernamepassword 由於注冊表單包含password字段, Scrapy嘗試將包含您的數據的表單發布到https://www.linkedin.com/start/reg/api/createAccount ,但失敗了,這就是 LinkedIn 返回422錯誤的原因。

解決方案:

在向LinkedIn提出任何請求之前,您需要確保您已登錄。為此,您的start_urls應包含登錄頁面。 由於LinkedIn上的登錄表單不使用usernamepassword字段,因此必須對其進行更改。 您可以轉到登錄頁面,檢查這些字段並找到它們的名稱。 它們分別是: session_keysession_password 之后,您可以向要解析的頁面發出請求:

class LoginSpider(BaseSpider):
    name = 'jiju'
    start_urls = ['https://www.linkedin.com/uas/login']

    def parse(self, response):
        return FormRequest.from_response(response,
                    formdata={'session_key': 'your_login', 'session_password': 'your_pass'},
                    callback=self.after_login)

    def after_login(self, response):
        return Request(url="https://www.linkedin.com/groups/58888/members", callback=self.parse_members)

會有更多的問題。 首先, LinkedIn使用JS代碼和AJAX請求來加載頁面的內容。 所以以這種方式收到的響應,可能不會包含您需要的數據。

如果您想執行JS代碼並接收您在瀏覽器中看到的響應,您可以使用Splash 無論如何,這樣做之后,您將不得不與reCAPTCHA斗爭。 您應該查看服務條款,看看它們是否允許爬蟲或機器人,可能不允許。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM