爬蟲 scrapy框架之遞迴解析和post請求

2022-06-11 09:33:08 字數 1919 閱讀 1838

概要

- 需求:將糗事百科所有頁碼的作者和段子內容資料進行爬取切持久化儲存

- 需求分析:每乙個頁面對應乙個url,則scrapy工程需要對每乙個頁碼對應的url依次發起請求,然後通過對應的解析方法進行作者和段子內容的解析。

實現方案:

1.將每乙個頁碼對應的url存放到爬蟲檔案的起始url列表(start_urls)中。(不推薦)

2.使用request方法手動發起請求。(推薦)

**展示:

#爬取多頁

pagenum = 1 #起始頁碼

url = 'page/%s/' #每頁的url

def parse(self, response):

div_list=response.xpath('//*[@id="content-left"]/div')

for div in div_list:

#//*[@id="qiushi_tag_120996995"]/div[1]/a[2]/h2

author=div.xpath('.//div[@class="author clearfix"]//h2/text()').extract_first()

author=author.strip('\n')

content=div.xpath('.//div[@class="content"]/span/text()').extract_first()

content=content.strip('\n')

item=qiushibaikeitem()

item['author']=author

item['content']=content

yield item #提交item到管道進行持久化

#爬取所有頁碼資料

if self.pagenum <= 13: #一共爬取13頁(共13頁)

self.pagenum += 1

url = format(self.url % self.pagenum)

#遞迴爬取資料:callback引數的值為**函式(將url請求後,得到的相應資料繼續進行parse解析),遞迴呼叫parse函式

yield scrapy.request(url=url,callback=self.parse)

- 問題:在之前**中,我們從來沒有手動的對start_urls列表中儲存的起始url進行過請求的傳送,但是起始url的確是進行了請求的傳送,那這是如何實現的呢?

- 解答:其實是因為爬蟲檔案中的爬蟲類繼承到了spider父類中的start_requests(self)這個方法,該方法就可以對start_urls列表中的url發起請求:

for u in self.start_urls:

yield scrapy.request(url=u,callback=self.parse)

【注意】該方法預設的實現,是對起始的url發起get請求,如果想發起post請求,則需要子類重寫該方法。

-方法: 重寫start_requests方法,讓其發起post請求:

#請求的url

post_url = ''

# post請求引數

formdata =

# 傳送post請求

yield scrapy.formrequest(url=post_url, formdata=formdata, callback=self.parse)

scrapy框架之遞迴解析和post請求

一.遞迴爬取解析多頁頁面資料 需求 將糗事百科所有頁碼的作者和段子內容資料進行爬取且持久化儲存 需求分析 每乙個頁面對應乙個url,則scrapy工程需要對乙個頁面對應的url一次發起請求,然後通過對應的解析方法進行作者和段子內容的解析.實現方案 1.將每乙個頁碼對應的url存放到爬蟲檔案的起始ur...

Python之scrapy框架爬蟲

scrapy命令詳解 可能是如今最全最簡單的scrapy命令解釋 明天上班,又要爬 現在每天做的工作有50 的時間爬 40 的時間清理資料,10 寫報告。若想自學資料分析,側重點很重要,我當初把大部分經歷放在了python的pandas numpymatplotlib上面,其他時間一部分放在sql身...

scrapy爬蟲框架之ImagePipeline

item pipeline item在spider中獲取後,將傳送到item pipeline中,執行對item的後續處理。每個item pipeline元件實現了簡單方法,它們接收item並執行一些操作,決定丟棄item還是讓其通過pipeline。item pipeline的作用 當然,你也可以...