python爬蟲06 | 你的第一個爬蟲,爬取當當網 Top 500 本五星好評書籍


 

來啦,老弟

 

 

我們已經知道怎么使用

 

Requests

 

進行各種請求騷操作

 

也知道了對服務器返回的數據如何使用

 

正則表達式

 

來過濾我們想要的內容

 

...

 

那么接下來

 

我們就使用 requests 和 re 來寫一個爬蟲

 

作為一個愛看書的你(說的跟真的似的)

 

 

怎么能發現好書呢?

 

所以我們

 

爬取當當網的前 500 本好五星評書籍

 

怎么樣?

 

 

ok

 

接下來就是

 

學習 python 的正確姿勢

 

請在電腦的陪同下

 

邊看本文邊練習

 

首先我們要對我們的目標網站進行分析

 

先摸清對方的底

 

我們才能戰無不勝

 

 

打開這個書籍排行榜的地址

 

http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-1

 

我們可以看到是這樣的一個網頁

 

 

每一頁顯示 20 本書

 

當我們點擊下一頁的時候

 

你可以發現地址變了

 

http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-2

 

也就是我們翻到第幾頁的時候

 

鏈接地址的最后一個參數會跟着變

 

那么我們等會在 python 中可以用一個變量

 

來實現獲取不同頁數的內容

 

 

接着

 

用我們之前說的 Chrome 騷操作

 

來分析一下

 

我們要的內容是怎么請求的

 

以及

 

返回給我們的源代碼是什么樣的

 

 

可以看到

 

我們通過 GET 請求

 

 

我們的請求頭

 

 

這是服務器返回來的數據

 

 

接着我們再來分析一下我們要抓取的關鍵信息

 

 

 

我們要的就是前 500 本書的

 

排名

書名

圖片地址

作者

推薦指數

五星評分次數

價格

 

通過源碼我們可以看到

 

這些信息被放在了 <li> 標簽中

 

 

那么我們等會就可以使用

 

年輕人,不會正則表達式你睡得着覺?有點出息沒有?

 

來進行過濾我們要的信息

 

一頓分析完了之后

 

接下來擼代碼了

 

 

主要思路

 

使用 page 變量來實現翻頁

 

我們使用 requests 請求當當網

 

然后將返回的 HTML 進行正則解析

 

由於我們暫時還沒學到數據庫

 

所以解析完之后就把內容存到文件中

 

 

def main(page):
   url = 'http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-' + str(page)
   html = request_dandan(url)
   items = parse_result(html) # 解析過濾我們想要的信息
   
   for item in items:
       write_item_to_file(item)

 

請求當當網

 

當我們請求成功之后

 

拿到源代碼

 

def request_dandan(url):
   try:
       response = requests.get(url)
       if response.status_code == 200:
           return response.text
   except requests.RequestException:
       return None

 

 

拿到源代碼了

 

就要對其解析

 

使用正則表達式獲取我們想要的關鍵信息

 

獲取到了之后我們封裝一下數據

 

def parse_result(html):
   pattern = re.compile('<li>.*?list_num.*?(\d+).</div>.*?<img src="(.*?)".*?class="name".*?title="(.*?)">.*?class="star">.*?class="tuijian">(.*?)</span>.*?class="publisher_info">.*?target="_blank">(.*?)</a>.*?class="biaosheng">.*?<span>(.*?)</span></div>.*?<p><span\sclass="price_n">&yen;(.*?)</span>.*?</li>',re.S)
   items = re.findall(pattern,html)
   for item in items:
       yield {
           'range': item[0],
           'iamge': item[1],
           'title': item[2],
           'recommend': item[3],
           'author': item[4],
           'times': item[5],
           'price': item[6]
       }

 

 

打印一下看看結果

 

for item in items:
       print(item)

 

可以看到這樣的數據

 

 

沒毛病

 

現在我們獲取的是第 1 頁的數據

 

如何自動獲取 25 頁 500 條數據呢

 

來個 for 循環唄

 

if __name__ == "__main__":
   for i in range(1,26):
       main(i)

 

 

獲取完 500 本書的數據之后

 

存到 book.txt 文件

 

 

def write_item_to_file(item):
   print('開始寫入數據 ====> ' + str(item))
   with open('book.txt', 'a', encoding='UTF-8') as f:
       f.write(json.dumps(item, ensure_ascii=False) + '\n')
       f.close()

 

 

完成

 

項目跑起來

 

 

 

打開我們存儲的 book.txt 看看

 

 

 

前 500 本書的數據就被我們拿到啦

 

 

 

本篇完

 

完整代碼小帥b已經放到公眾號后台啦

 

需要的朋友

 

在公眾號發送

 

500

 

即可獲取

 

ok

 

咱們下回再見

 

 

掃一掃

學習 Python 沒煩惱

 

 

 

近期文章

 

python爬蟲03 | 那個叫做Urllib的庫讓我們的python假裝是瀏覽器

 

python爬蟲04 | 長江后浪推前浪,Requests庫把urllib庫拍在沙灘上

 

python爬蟲05 | 年輕人,不會正則表達式你睡得着覺?有點出息沒有?

 

 

 

 

 

 

 

支持小帥b的就順手

點個好看吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM