亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Scrapy:登錄后抓取下一頁

Scrapy:登錄后抓取下一頁

BIG陽 2023-10-26 16:55:13
我對網絡抓取還很陌生。成功登錄 Quotes.toscrape.com 網站后,我嘗試抓取頁面。我的代碼(scrapytest/spiders/quotes_spider.py)如下:import scrapyfrom scrapy.http import FormRequestfrom ..items import ScrapytestItemfrom scrapy.utils.response import open_in_browserfrom scrapy.spiders.init import InitSpiderclass QuoteSpider(scrapy.Spider):    name = 'scrapyquotes'    login_url = 'http://quotes.toscrape.com/login'    start_urls = [login_url]    def parse(self,response):        token = response.css('input[name="csrf_token"]::attr(value)').extract_first()        yield scrapy.FormRequest(url=self.login_url,formdata={            'csrf_token':token,            'username':'roberthng',            'password':'dsadsadsa'        },callback = self.start_scraping)    def start_scraping(self,response):        items = ScrapytestItem()        all_div_quotes=response.css('div.quote')        for quotes in all_div_quotes:            title = quotes.css('span.text::text').extract()            author = quotes.css('.author::text').extract()            tag = quotes.css('.tag::text').extract()            items['title'] = title            items['author'] = author            items['tag'] = tag            yield items        #Go to Next Page:             next_page = response.css('li.next a::attr(href)').get()        if next_page is not None:            yield response.follow(next_page, callback=self.parse)每當我在終端(VSC)上通過 $ scrapy scrapy scrapyquotes 運行此代碼時,該代碼只能抓取登錄并抓取第一頁??偸桥啦坏降诙摗O旅媸浅霈F的錯誤消息:2020-10-10 12:26:42 [scrapy.core.engine] 調試:已抓取 (200) <GET http://quotes.toscrape.com/page/2/>(參考: http://quotes.toscrape .com/)2020-10-10 12:26:42 [scrapy.core.scraper] 錯誤:蜘蛛處理錯誤 <GET http://quotes.toscrape.com/page/2/>(參考: http://quotes.toscrape. com/ )我懷疑這與 start_urls 有關,但是當我將其更改為“http://quotes.toscrape.com/page/1”時,代碼甚至不會抓取第一頁。誰能幫我解決這個代碼嗎?先感謝您!
查看完整描述

2 回答

?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

您將錯誤的函數傳遞給回調,您的self.parse函數只能在登錄頁面上使用。

if next_page is not None: 
   yield response.follow(next_page, callback=self.start_scraping)


查看完整回答
反對 回復 2023-10-26
?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

這是來自您的執行日志:


  File "C:\Users\Robert\Documents\Demos\vstoolbox\scrapytest\scrapytest\spiders\quotes_spider.py", line 15, in parse

    yield scrapy.FormRequest(url=self.login_url,formdata={

  File "C:\Users\Robert\anaconda3\envs\condatest\lib\site-packages\scrapy\http\request\form.py", line 31, in __init__

    querystr = _urlencode(items, self.encoding)

  File "C:\Users\Robert\anaconda3\envs\condatest\lib\site-packages\scrapy\http\request\form.py", line 71, in _urlencode

    values = [(to_bytes(k, enc), to_bytes(v, enc))

  File "C:\Users\Robert\anaconda3\envs\condatest\lib\site-packages\scrapy\http\request\form.py", line 71, in <listcomp>

    values = [(to_bytes(k, enc), to_bytes(v, enc))

  File "C:\Users\Robert\anaconda3\envs\condatest\lib\site-packages\scrapy\utils\python.py", line 104, in to_bytes

    raise TypeError('to_bytes must receive a str or bytes '

TypeError: to_bytes must receive a str or bytes object, got NoneType

簡而言之,它告訴您formdata參數中的參數是None,但預計它是“a str 或 bytes 對象”。鑒于您formdata有三個字段,只有一個是變量,token必須返回空。


    ...

    token = response.css('input[name="csrf_token"]::attr(value)').extract_first()

    yield scrapy.FormRequest(url=self.login_url,formdata={

        'csrf_token':token,

        'username':'roberthng',

        'password':'dsadsadsa'

    },callback = self.start_scraping)

但是,如果您位于登錄頁面,您的選擇器會正確返回值。我的假設是,當您定義下一頁的請求時,您正在將回調設置為您的parse方法(或者根本不設置它,這會導致parse默認)。我說假設,因為你沒有發布那部分代碼。您的代碼示例停在這里:


    #Go to Next Page:     

    next_page = response.css('li.next a::attr(href)').get()

    if next_page is not None:

因此,請確保在此之后為請求正確設置回調函數。


查看完整回答
反對 回復 2023-10-26
  • 2 回答
  • 0 關注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號