Python實戰(zhàn)爬蟲之女友欲買文胸不知何色更美
情景再現(xiàn)
今日天氣尚好,女友忽然欲買文胸,但不知何色更美,遂命吾剖析何色買者益眾,為點議,事后而獎勵之。
本文關鍵詞
協(xié)程并發(fā)😊、IP被封😳、IP代理😏、代理被封😭、一種植物🌿
挑個“軟柿子”
打開京東,直接搜 【文胸】,挑個評論最多的
進入詳情頁,往下滑,可以看到商品介紹啥的,同時商品評價也在這里。
接下來重頭戲,F(xiàn)12 打開 開發(fā)者工具,選擇 Network,然后點擊全部評價,抓取數(shù)據(jù)包。
將 url 打開,發(fā)現(xiàn)確實是評論數(shù)據(jù)。
單頁爬取
那我們先寫個小 demo 來嘗試爬取這頁的代碼,看看有沒有什么問題。
import requests import pandas as pd headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36' } params = { 'callback':'fetchJSON_comment98', 'productId':'35152509650', 'score':'0', 'sortType':'6', 'page': '5', 'pageSize':'10', 'isShadowSku':'0', 'rid':'0', 'fold':'1' } url = 'https://club.jd.com/comment/productPageComments.action?' page_text = requests.get(url=url, headers=headers, params=params).text page_text
數(shù)據(jù)處理
數(shù)據(jù)是獲取了,但前面多了一些沒用的字符(后面也有),很明顯不能直接轉(zhuǎn)成 json
格式,需要處理一下。
page_text = page_text[20: len(page_text) - 2] data = json.loads(page_text) data
現(xiàn)在數(shù)據(jù)格式處理好了,可以上手解析數(shù)據(jù),提取我們所需要的部分。這里我們只提取 id
(評論id)、color
(產(chǎn)品顏色)、comment
(評價)、time
(評價時間)。
import pandas as pd df = pd.DataFrame({'id': [], 'color': [], 'comment': [], 'time': []}) for info in data['comments']: df = df.append({'id': info['id'], 'color': info['productColor'], 'comment': info['content'], 'time': info['creationTime']}, ignore_index=True) df
翻頁操作
那么接下來就要尋找翻頁的關鍵了,下面用同樣的方法獲取第二頁、第三頁的url,進行對比。
簡單分析一下,page
字段是頁數(shù),翻頁會用到,值得注意的是 sortType
,字面意思是排序類型,猜測排序方式可能是:熱度、時間等。經(jīng)過測試發(fā)現(xiàn) sortType=5
肯定不是按時間排序的,應該是熱度,我們要獲取按時間排序的,這樣后期比較好處理,然后試了幾個值,最后確定當 sortType=6
時是按評價時間排序。圖中最后還有個 rid=0
,不清楚什么作用,我爬取兩個相同的url(一個加 rid
一個不加),測試結果是相同的,所以不用管它。
擼代碼
先寫爬取結果:開始想爬 10000 條評價,結果請求過多IP涼了,從IP池整了丶代理,也沒頂住,拼死拼活整了1000條,時間不夠,如果時間和IP充足,隨便爬。經(jīng)過測試發(fā)現(xiàn)這個IP封鎖時間不會超過一天,第二天我跑了一下也有數(shù)據(jù)。下面看看主要的代碼。
主調(diào)度函數(shù)
設置爬取的 url
列表,windows
環(huán)境下記得限制并發(fā)量,不然報錯,將爬取的任務添加到 tasks
中,掛起任務。
async def main(loop): # 獲取url列表 page_list = list(range(0, 1000)) # 限制并發(fā)量 semaphore = asyncio.Semaphore(500) # 創(chuàng)建任務對象并添加到任務列表中 tasks = [loop.create_task(get_page_text(page, semaphore)) for page in page_list] # 掛起任務列表 await asyncio.wait(tasks)
頁面抓取函數(shù)
抓取方法和上面講述的基本一致,只不過換成 aiohttp
進行請求,對于SSL證書的驗證也已設置。程序執(zhí)行后直接進行解析保存。
async def get_page_text(page, semaphore): async with semaphore: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36' } params = { 'callback': 'fetchJSON_comment98', 'productId': '35152509650', 'score': '0', 'sortType': '6', 'page': f'{page}', 'pageSize': '10', 'isShadowSku': '0', # 'rid': '0', 'fold': '1' } url = 'https://club.jd.com/comment/productPageComments.action?' async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False), trust_env=True) as session: while True: try: async with session.get(url=url, proxy='http://' + choice(proxy_list), headers=headers, params=params, timeout=4) as response: # 遇到IO請求掛起當前任務,等IO操作完成執(zhí)行之后的代碼,當協(xié)程掛起時,事件循環(huán)可以去執(zhí)行其他任務。 page_text = await response.text() # 未成功獲取數(shù)據(jù)時,更換ip繼續(xù)請求 if response.status != 200: continue print(f"第{page}頁爬取完成!") break except Exception as e: print(e) # 捕獲異常,繼續(xù)請求 continue return parse_page_text(page_text)
解析保存函數(shù)
將 json 數(shù)據(jù)解析以追加的形式保存到 csv 中。
def parse_page_text(page_text): page_text = page_text[20: len(page_text) - 2] data = json.loads(page_text) df = pd.DataFrame({'id': [], 'color': [], 'comment': [], 'time': []}) for info in data['comments']: df = df.append({'id': info['id'], 'color': info['productColor'], 'comment': info['content'], 'time': info['creationTime']}, ignore_index=True) header = False if Path.exists(Path('評價信息.csv')) else True df.to_csv('評價信息.csv', index=False, mode='a', header=header) print('已保存')
可視化
顏色分布
排名前三分別是灰粉色、黑色、裸感膚色,多的不說,自己體會哈。
評價詞云圖
可以看出評價的關鍵詞大多是對上身感覺的一些描述,穿著舒服當然是第一位的~
完結撒花,該向女朋友匯報工作了~
別忘記收藏哦~
到此這篇關于Python實戰(zhàn)爬蟲之女友欲買文胸不知何色更美的文章就介紹到這了,更多相關Python 爬蟲文胸內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
安裝python3.7編譯器后如何正確安裝opnecv的方法詳解
這篇文章主要介紹了安裝python3.7編譯器后如何正確安裝opnecv,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06python 處理數(shù)字,把大于上限的數(shù)字置零實現(xiàn)方法
今天小編就為大家分享一篇python 處理數(shù)字,把大于上限的數(shù)字置零實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01