python爬虫06 | 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍
?
來啦,老弟
?
?
我們已經(jīng)知道怎么使用
?
Requests
?
進(jìn)行各種請(qǐng)求騷操作
?
也知道了對(duì)服務(wù)器返回的數(shù)據(jù)如何使用
?
正則表達(dá)式
?
來過濾我們想要的內(nèi)容
?
...
?
那么接下來
?
我們就使用 requests 和 re 來寫一個(gè)爬蟲
?
作為一個(gè)愛看書的你(說的跟真的似的)
?
?
怎么能發(fā)現(xiàn)好書呢?
?
所以我們
?
爬取當(dāng)當(dāng)網(wǎng)的前 500 本好五星評(píng)書籍
?
怎么樣?
?
?
ok
?
接下來就是
?
學(xué)習(xí) python 的正確姿勢(shì)
?
請(qǐng)?jiān)陔娔X的陪同下
?
邊看本文邊練習(xí)
?
首先我們要對(duì)我們的目標(biāo)網(wǎng)站進(jìn)行分析
?
先摸清對(duì)方的底
?
我們才能戰(zhàn)無不勝
?
?
打開這個(gè)書籍排行榜的地址
?
http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-1
?
我們可以看到是這樣的一個(gè)網(wǎng)頁
?
?
每一頁顯示 20 本書
?
當(dāng)我們點(diǎn)擊下一頁的時(shí)候
?
你可以發(fā)現(xiàn)地址變了
?
http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-2
?
也就是我們翻到第幾頁的時(shí)候
?
鏈接地址的最后一個(gè)參數(shù)會(huì)跟著變
?
那么我們等會(huì)在 python 中可以用一個(gè)變量
?
來實(shí)現(xiàn)獲取不同頁數(shù)的內(nèi)容
?
?
接著
?
用我們之前說的?Chrome?騷操作
?
來分析一下
?
我們要的內(nèi)容是怎么請(qǐng)求的
?
以及
?
返回給我們的源代碼是什么樣的
?
?
可以看到
?
我們通過 GET 請(qǐng)求
?
?
我們的請(qǐng)求頭
?
?
這是服務(wù)器返回來的數(shù)據(jù)
?
?
接著我們?cè)賮矸治鲆幌挛覀円ト〉年P(guān)鍵信息
?
?
?
我們要的就是前 500 本書的
?
排名
書名
圖片地址
作者
推薦指數(shù)
五星評(píng)分次數(shù)
價(jià)格
?
通過源碼我們可以看到
?
這些信息被放在了 <li> 標(biāo)簽中
?
?
那么我們等會(huì)就可以使用
?
年輕人,不會(huì)正則表達(dá)式你睡得著覺?有點(diǎn)出息沒有?
?
來進(jìn)行過濾我們要的信息
?
一頓分析完了之后
?
接下來擼代碼了
?
?
主要思路
?
使用 page 變量來實(shí)現(xiàn)翻頁
?
我們使用 requests 請(qǐng)求當(dāng)當(dāng)網(wǎng)
?
然后將返回的 HTML 進(jìn)行正則解析
?
由于我們暫時(shí)還沒學(xué)到數(shù)據(jù)庫
?
所以解析完之后就把內(nèi)容存到文件中
?
?
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)
?
請(qǐng)求當(dāng)當(dāng)網(wǎng)
?
當(dāng)我們請(qǐng)求成功之后
?
拿到源代碼
?
def request_dandan(url):? ?try:
? ? ? ?response = requests.get(url)
? ? ? ?if response.status_code == 200:
? ? ? ? ? ?return response.text
? ?except requests.RequestException:
? ? ? ?return None
?
?
拿到源代碼了
?
就要對(duì)其解析
?
使用正則表達(dá)式獲取我們想要的關(guān)鍵信息
?
獲取到了之后我們封裝一下數(shù)據(jù)
?
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]
? ? ? ?}
?
?
打印一下看看結(jié)果
?
for item in items:? ? ? ?print(item)
?
可以看到這樣的數(shù)據(jù)
?
?
沒毛病
?
現(xiàn)在我們獲取的是第 1 頁的數(shù)據(jù)
?
如何自動(dòng)獲取 25 頁 500 條數(shù)據(jù)呢
?
來個(gè) for 循環(huán)唄
?
if __name__ == "__main__":? ?for i in range(1,26):
? ? ? ?main(i)
?
?
獲取完 500 本書的數(shù)據(jù)之后
?
存到 book.txt 文件
?
?
def write_item_to_file(item):? ?print('開始寫入數(shù)據(jù) ====> ' + str(item))
? ?with open('book.txt', 'a', encoding='UTF-8') as f:
? ? ? ?f.write(json.dumps(item, ensure_ascii=False) + '\n')
? ? ? ?f.close()
?
?
完成
?
項(xiàng)目跑起來
?
?
?
打開我們存儲(chǔ)的 book.txt 看看
?
?
?
前 500 本書的數(shù)據(jù)就被我們拿到啦
?
?
?
本篇完
?
完整代碼小帥b已經(jīng)放到公眾號(hào)后臺(tái)啦
?
需要的朋友
?
在公眾號(hào)發(fā)送
?
500
?
即可獲取
?
ok
?
咱們下回再見
?
?
掃一掃
學(xué)習(xí) Python 沒煩惱
?
?
?
近期文章
?
python爬蟲03 | 那個(gè)叫做Urllib的庫讓我們的python假裝是瀏覽器
?
python爬蟲04 | 長江后浪推前浪,Requests庫把urllib庫拍在沙灘上
?
python爬蟲05 | 年輕人,不會(huì)正則表達(dá)式你睡得著覺?有點(diǎn)出息沒有?
?
?
?
?
?
?
?
支持小帥b的就順手
點(diǎn)個(gè)好看吧
轉(zhuǎn)載于:https://www.cnblogs.com/fxxkpython/p/10832023.html
總結(jié)
以上是生活随笔為你收集整理的python爬虫06 | 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python简单爬豆瓣电影排名
- 下一篇: 第四次上级作业