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">¥(.*?)</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的就順手
點個好看吧
轉載于:https://www.cnblogs.com/fxxkpython/p/10832023.html
總結
以上是生活随笔為你收集整理的python爬虫06 | 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python简单爬豆瓣电影排名
- 下一篇: python网络爬虫之requests模