來啦,老弟
我們已經知道怎么使用
進行各種請求騷操作
也知道了對服務器返回的數據如何使用
來過濾我們想要的內容
...
那么接下來
我們就使用 requests 和 re 來寫一個爬蟲
作為一個愛看書的你(說的跟真的似的)
怎么能發現好書呢?
所以我們
爬取當當網的前 500 本好五星評書籍
怎么樣?
ok
接下來就是
請在電腦的陪同下
邊看本文邊練習
首先我們要對我們的目標網站進行分析
先摸清對方的底
我們才能戰無不勝
打開這個書籍排行榜的地址
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的就順手
點個好看吧