摘要:文章目錄情景再現本文關鍵詞挑個軟柿子單頁爬取數據處理翻頁操作擼代碼主調度函數頁面抓取函數解析保存函數可視化顏色分布評價詞云圖源碼獲取方式情景再現今日天氣尚好,女友忽然欲買文胸,但不知何色更美,遂命吾剖析何色買者益眾,為點議,事后而獎勵之。
今日天氣尚好,女友忽然欲買文胸,但不知何色更美,遂命吾剖析何色買者益眾,為點議,事后而獎勵之。
協程并發?、IP被封?、IP代理?、代理被封?、一種植物?
打開京東,直接搜 【文胸】,挑個評論最多的
進入詳情頁,往下滑,可以看到商品介紹啥的,同時商品評價也在這里。
接下來重頭戲,F12 打開 開發者工具,選擇 Network,然后點擊全部評價,抓取數據包。
將 url 打開,發現確實是評論數據。
那我們先寫個小 demo 來嘗試爬取這頁的代碼,看看有沒有什么問題。
import requestsimport pandas as pdheaders = { "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).textpage_text
數據是獲取了,但前面多了一些沒用的字符(后面也有),很明顯不能直接轉成 json
格式,需要處理一下。
page_text = page_text[20: len(page_text) - 2]data = json.loads(page_text)data
現在數據格式處理好了,可以上手解析數據,提取我們所需要的部分。這里我們只提取 id
(評論id)、color
(產品顏色)、comment
(評價)、time
(評價時間)。
import pandas as pddf = 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
字段是頁數,翻頁會用到,值得注意的是 sortType
,字面意思是排序類型,猜測排序方式可能是:熱度、時間等。經過測試發現 sortType=5
肯定不是按時間排序的,應該是熱度,我們要獲取按時間排序的,這樣后期比較好處理,然后試了幾個值,最后確定當 sortType=6
時是按評價時間排序。圖中最后還有個 rid=0
,不清楚什么作用,我爬取兩個相同的url(一個加 rid
一個不加),測試結果是相同的,所以不用管它。
先寫爬取結果:開始想爬 10000 條評價,結果請求過多IP涼了,從IP池整了丶代理,也沒頂住,拼死拼活整了1000條,時間不夠,如果時間和IP充足,隨便爬。經過測試發現這個IP封鎖時間不會超過一天,第二天我跑了一下也有數據。下面看看主要的代碼。
設置爬取的 url
列表,windows
環境下記得限制并發量,不然報錯,將爬取的任務添加到 tasks
中,掛起任務。
async def main(loop): # 獲取url列表 page_list = list(range(0, 1000)) # 限制并發量 semaphore = asyncio.Semaphore(500) # 創建任務對象并添加到任務列表中 tasks = [loop.create_task(get_page_text(page, semaphore)) for page in page_list] # 掛起任務列表 await asyncio.wait(tasks)
抓取方法和上面講述的基本一致,只不過換成 aiohttp
進行請求,對于SSL證書的驗證也已設置。程序執行后直接進行解析保存。
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操作完成執行之后的代碼,當協程掛起時,事件循環可以去執行其他任務。 page_text = await response.text() # 未成功獲取數據時,更換ip繼續請求 if response.status != 200: continue print(f"第{page}頁爬取完成!") break except Exception as e: print(e) # 捕獲異常,繼續請求 continue return parse_page_text(page_text)
將 json 數據解析以追加的形式保存到 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("已保存")
排名前三分別是灰粉色、黑色、裸感膚色,多的不說,自己體會哈。
可以看出評價的關鍵詞大多是對上身感覺的一些描述,穿著舒服當然是第一位的~
完結撒花,該向女朋友匯報工作了~
??往期精彩,不容錯過??
總結篇
??兩萬字,50個pandas高頻操作【圖文并茂,值得收藏】??
??吐血總結《Mysql從入門到入魔》,圖文并茂(建議收藏)??
工具篇
??Python實用小工具之制作酷炫二維碼(有界面、附源碼)??
??Python實用工具之制作證件照(有界面、附源碼)??
??女朋友桌面文件雜亂無章?氣得我用Python給她做了一個文件整理工具??
別忘記點贊哦~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/121683.html
摘要:前面我在自動化控制版微信該系列文中更新了控制微信發送圖片的方法。根據部分群友實際工作的需要,本文將分享如何控制微信發送文件。接下來我將破解這個領域的世界未解之謎,彌補無人完成這個功能的缺陷。 ...
摘要:對于前女友發來的結婚請柬,男人多半是不會去參加婚禮的,但也有少數前任,還是會收下請柬,準備好紅包,如約去參加前女友的婚禮,而在婚禮現場默默,掏出了,連上現場的婚禮第一大廳,打開開發工具。 目錄 前言 安裝模塊 生成密碼本 完整代碼 連接成功 拿下路由器 修改WIFI名稱 結語 前言 ????...
摘要:開發者調查顯示,是增長最快的主流編程語言。華文宋體在數據科學和中占據主導地位,主要基于以下原因華文宋體門檻低,上手快。華文宋體信盈達全棧人工智能培訓華文宋體華文宋體互聯網人才趨勢白皮書顯示,年人才需求增速,缺口高達萬。 計算機語言發展至今,已出現眾多的編程語言。例如入門較難的C語言,相對通用的Java,適合初學者的Basi...
摘要:故而總結如下編成的代碼浪漫的環境親手制作的禮物注意請將下面的程序員的情人節禮物換成語言。言歸正傳程序員的情人節禮物入門之材料構思情人節禮物之設備展示想著在這個移動盛行的時代,再用電腦就不太合適了。 是時候應該反擊了 當我看到@鄢得諼草 的那幾篇黑我黑到體無完膚的#極客愛情# @Phodal 故事的時候,我發現我竟無言以對。或許,作為一名程序員,我們或多或少都有這樣的共性。 ...
閱讀 3217·2021-09-30 09:48
閱讀 3495·2021-09-22 16:00
閱讀 1067·2019-08-30 13:08
閱讀 3108·2019-08-30 10:53
閱讀 2417·2019-08-29 18:33
閱讀 1590·2019-08-29 12:47
閱讀 901·2019-08-29 12:16
閱讀 1934·2019-08-26 12:02