今天要抓取的一個網站叫作微醫
網站,地址爲 https://www.guahao.com
,咱們將經過python3爬蟲抓取這個網址,而後數據存儲到CSV裏面,爲後面的一些分析類的教程作準備。本篇文章主要使用的庫爲pyppeteer
和 pyquery
html
首先找到 醫生列表頁python
https://www.guahao.com/expert/all/全國/all/不限/p5
這個頁面顯示有 75952 條數據 ,實際測試中,翻頁到第38頁,數據就加載不出來了,目測後臺程序猿沒有把數據返回,不過爲了學習,咱們忍了。git
https://www.guahao.com/expert/all/全國/all/不限/p1 https://www.guahao.com/expert/all/全國/all/不限/p2 ... https://www.guahao.com/expert/all/全國/all/不限/p38
數據總過38頁,量不是很大,咱只須要隨便選擇一個庫抓取就行,這篇博客,我找了一個冷門的庫pyppeteer
在使用過程當中,發現資料好少,很尷尬。並且官方的文檔寫的也很差,有興趣的能夠自行去看看。關於這個庫的安裝也在下面的網址中。github
https://miyakogi.github.io/pyppeteer/index.html瀏覽器
最簡單的使用方法,在官方文檔中也簡單的寫了一下,以下,能夠把一個網頁直接保存爲一張圖片。cookie
import asyncio from pyppeteer import launch async def main(): browser = await launch() # 運行一個無頭的瀏覽器 page = await browser.newPage() # 打開一個選項卡 await page.goto('http://www.baidu.com') # 加載一個頁面 await page.screenshot({'path': 'baidu.png'}) # 把網頁生成截圖 await browser.close() asyncio.get_event_loop().run_until_complete(main()) # 異步 Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這裏是Python學習者的彙集地,零基礎,進階,都歡迎
我整理了下面的一些參考代碼,你能夠 作一些參考。app
browser = await launch(headless=False) # 能夠打開瀏覽器 await page.click('#login_user') # 點擊一個按鈕 await page.type('#login_user', 'admin') # 輸入內容 await page.click('#password') await page.type('#password', '123456') await page.click('#login-submit') await page.waitForNavigation() # 設置瀏覽器窗口大小 await page.setViewport({ 'width': 1350, 'height': 850 }) content = await page.content() # 獲取網頁內容 cookies = await page.cookies() # 獲取網頁cookies
運行下面的代碼,你就能夠看到控制檯不斷的打印網頁的源碼,只要獲取到源碼,就能夠進行後面的解析與保存數據了。若是出現控制不輸出任何東西的狀況,那麼請把下面的await launch(headless=True) 修改成 await launch(headless=False)
less
import asyncio from pyppeteer import launch class DoctorSpider(object): async def main(self, num): try: browser = await launch(headless=True) page = await browser.newPage() print(f"正在爬取第 {num} 頁面") await page.goto("https://www.guahao.com/expert/all/全國/all/不限/p{}".format(num)) content = await page.content() print(content) except Exception as e: print(e.args) finally: num += 1 await browser.close() await self.main(num) def run(self): loop = asyncio.get_event_loop() asyncio.get_event_loop().run_until_complete(self.main(1)) if __name__ == '__main__': doctor = DoctorSpider() doctor.run()
解析數據採用的是pyquery ,這個庫在以前的博客中有過使用,直接應用到案例中便可。最終產生的數據經過pandas
保存到CSV文件中。異步
import asyncio from pyppeteer import launch from pyquery import PyQuery as pq import pandas as pd # 保存csv文件 class DoctorSpider(object): def __init__(self): self._data = list() async def main(self,num): try: browser = await launch(headless=True) page = await browser.newPage() print(f"正在爬取第 {num} 頁面") await page.goto("https://www.guahao.com/expert/all/全國/all/不限/p{}".format(num)) content = await page.content() self.parse_html(content) print("正在存儲數據....") data = pd.DataFrame(self._data) data.to_csv("微醫數據.csv", encoding='utf_8_sig') except Exception as e: print(e.args) finally: num+=1 await browser.close() await self.main(num) def parse_html(self,content): doc = pq(content) items = doc(".g-doctor-item").items() for item in items: #doctor_name = item.find(".seo-anchor-text").text() name_level = item.find(".g-doc-baseinfo>dl>dt").text() # 姓名和級別 department = item.find(".g-doc-baseinfo>dl>dd>p:eq(0)").text() # 科室 address = item.find(".g-doc-baseinfo>dl>dd>p:eq(1)").text() # 醫院地址 star = item.find(".star-count em").text() # 評分 inquisition = item.find(".star-count i").text() # 問診量 expert_team = item.find(".expert-team").text() # 專家團隊 service_price_img = item.find(".service-name:eq(0)>.fee").text() service_price_video = item.find(".service-name:eq(1)>.fee").text() one_data = { "name": name_level.split(" ")[0], "level": name_level.split(" ")[1], "department": department, "address": address, "star": star, "inquisition": inquisition, "expert_team": expert_team, "service_price_img": service_price_img, "service_price_video": service_price_video } self._data.append(one_data) def run(self): loop = asyncio.get_event_loop() asyncio.get_event_loop().run_until_complete(self.main(1)) if __name__ == '__main__': doctor = DoctorSpider() doctor.run() Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這裏是Python學習者的彙集地,零基礎,進階,都歡迎
總結一下,這個庫不怎麼好用,可能以前沒有細細的研究過,感受通常,你能夠在多嘗試一下,看一下是否能夠把總體的效率提升上去。async
數據清單: