1. 程式人生 > >Python爬蟲新手教程:微醫掛號網醫生資料抓取

Python爬蟲新手教程:微醫掛號網醫生資料抓取

1. 寫在前面

今天要抓取的一個網站叫做微醫網站,地址為 https://www.guahao.com ,我們將通過python3爬蟲抓取這個網址,然後資料儲存到CSV裡面,為後面的一些分析類的教程做準備。本篇文章主要使用的庫為pyppeteerpyquery

首先找到 醫生列表頁

https://www.guahao.com/expert/all/全國/all/不限/p5  

這個頁面顯示有 75952 條資料 ,實際測試中,翻頁到第38頁,資料就載入不出來了,目測後臺程式猿沒有把資料返回,不過為了學習,我們忍了。

2. 頁面URL

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 在使用過程中,發現資料好少,很尷尬。而且官方的文件寫的也不好,有興趣的可以自行去看看。關於這個庫的安裝也在下面的網址中。

https://miyakogi.github.io/pyppeteer/index.html

最簡單的使用方法,在官方文件中也簡單的寫了一下,如下,可以把一個網頁直接儲存為一張圖片。

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())  # 非同步

我整理了下面的一些參考程式碼,你可以 做一些參考。

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

3. 爬取頁面

執行下面的程式碼,你就可以看到控制檯不斷的列印網頁的原始碼,只要獲取到原始碼,就可以進行後面的解析與儲存資料了。如果出現控制不輸出任何東西的情況,那麼請把下面的 await launch(headless=True) 修改為 await launch(headless=False)

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()
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視訊,這裡是Python學習者的聚集地,零基礎,進階,都歡迎

4. 解析資料

解析資料採用的是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學習者的聚集地,零基礎,進階,都歡迎

總結一下,這個庫不怎麼好用,可能之前沒有細細的研究過,感覺一般,你可以在多嘗試一下,看一下是否可以把整體的效率提高上去。

資料清單:

相關推薦

Python爬蟲新手教程掛號醫生資料

1. 寫在前面 今天要抓取的一個網站叫做微醫網站,地址為 https://www.guahao.com ,我們將通過python3

Python爬蟲入門教程 18-100 煎蛋XXOO圖片

寫在前面 很高興我這系列的文章寫道第18篇了,今天寫一個爬蟲愛好者特別喜歡的網站煎蛋網http://jandan.net/ooxx,這個網站其實還是有點意思的,網站很多人寫了N多的教程了,各種方式的都有,當然網站本身在爬蟲愛好者的不斷進攻下,也在不斷的完善,反爬措施也很多,今天我用selenium在揍他一波

Python爬蟲入門教程 20-100 慕課免費課程

寫在前面 美好的一天又開始了,今天咱繼續爬取IT線上教育類網站,慕課網,這個平臺的資料量並不是很多,所以爬取起來還是比較簡單的 準備爬取 開啟我們要爬取的頁面,尋找分頁點和檢視是否是非同步載入的資料。 進行了一些相應的分析,發現並沒有非同步資料,只需要模擬翻頁就,在進行HTML的解析就可以獲取資料

Python爬蟲新手教程 知乎文章圖片爬

1. 知乎文章圖片爬取器之二部落格背景 昨天寫了知乎文章圖片爬取器的一部分程式碼,針對知乎問題的答案json進行了資料抓取,部落格

Python爬蟲新手教程了6574篇文章,告訴你產品經理在看什麼!

作為網際網路界的兩個對立的物種,產品汪與程式猿似乎就像一對天生的死對頭;但是在產品開發鏈條上緊密合作的雙方,只有通力合作,才能更好

Python爬蟲新手教程手機APP資料 pyspider

1. 手機APP資料----寫在前面 繼續練習pyspider的使用,最近搜尋了一些這個框架的一些使用技巧,發現文件竟然挺難理解的

Python爬蟲新手教程Python分析了 7 萬款 App,萬萬沒想到

摘要:使用 Scrapy 爬取豌豆莢全網 70,000+ App,並進行探索性分析。 寫在前面:若對資料抓取部分不感興趣,可以直接

Python爬蟲新手教程實戰APP包,抖音的小姐姐等著我!

APP抓包 前面我們瞭解了一些關於 Python 爬蟲的知識,不過都是基於 PC 端瀏覽器網頁中的內容進行爬取。現在手機 App

Python爬蟲入門教程 3-100 美空數據爬

個數 exception 意思 消費 時間模塊 intel insert -o switch 簡介 從今天開始,我們嘗試用2篇博客的內容量,搞定一個網站叫做“美空網”網址為:http://www.moko.cc/, 這個網站我分析了一下,我們要爬取的圖片在 下面這個網址

Python爬蟲入門教程 15-100 石家莊政民互動資料

寫在前面 今天,咱抓取一個網站,這個網站呢,涉及的內容就是 網友留言和回覆,特別簡單,但是網站是gov的。網址為 http://www.sjz.gov.cn/col/1490066682000/index.html 首先宣告,為了學習,絕無惡意抓取資訊,不管

Python爬蟲入門教程 19-100 51CTO學院IT技術課程

寫在前面 從今天開始的幾篇文章,我將就國內目前比較主流的一些線上學習平臺數據進行抓取,如果時間充足的情況下,會對他們進行一些簡單的分析,好了,平臺大概有51CTO學院,CSDN學院,網易雲課堂,慕課網等平臺,資料統一抓取到mongodb裡面,如果對上述平臺造成了困擾,請見諒,畢竟我就抓取那麼一小會的時間,不

Python爬蟲入門教程 31-100 36氪(36kr)數據 scrapy

published views lse format 後臺 get 速度 allow response 1. 36氪(36kr)數據----寫在前面 今天抓取一個新聞媒體,36kr的文章內容,也是為後面的數據分析做相應的準備的,預計在12月底,爬蟲大概寫到50篇案例的時刻,

Python爬蟲視訊教程教你爬QQ音樂資料(實戰處理+資料視覺化)-劉宇宙-專題視訊課程...

Python爬蟲視訊教程:教你爬取QQ音樂資料(實戰處理+資料視覺化)—704人已學習 課程介紹        本視訊課程主要培訓Python爬蟲入門,資料分析及資料視覺化實戰內容,通過本課的學習,您可以在2小時左右掌握Python基礎程式設計的核心內容,實現Python在爬

Python爬蟲入門教程 4-100 美空未登入圖片爬

簡介 上一篇寫的時間有點長了,接下來繼續把美空網的爬蟲寫完,這套教程中編寫的爬蟲在實際的工作中可能並不能給你增加多少有價值的技術點,因為它只是一套入門的教程,老鳥你自動繞過就可以了,或者帶帶我也行。 爬蟲分析 首先,我們已經爬取到了N多的使用者個人主頁,我通過連結拼接獲取到了 www.moko.cc/

Python爬蟲入門教程 3-100 美空資料

簡介 從今天開始,我們嘗試用2篇部落格的內容量,搞定一個網站叫做“美空網”網址為:http://www.moko.cc/, 這個網站我分析了一下,我們要爬取的圖片在 下面這個網址 http://www.moko.cc/post/1302075.html 然後在去分析一下,我需要找到一個圖片列表

Python爬蟲入門教程 4-100 美空未登錄圖片爬

表數 價值 圖片下載 開發 所有圖片 mpi focus .data data 簡介 上一篇寫的時間有點長了,接下來繼續把美空網的爬蟲寫完,這套教程中編寫的爬蟲在實際的工作中可能並不能給你增加多少有價值的技術點,因為它只是一套入門的教程,老鳥你自動繞過就可以了,或者帶帶我也

Python爬蟲入門教程 10-100 圖蟲多執行緒爬

寫在前面 經歷了一頓噼裡啪啦的操作之後,終於我把部落格寫到了第10篇,後面,慢慢的會涉及到更多的爬蟲模組,有人問scrapy 啥時候開始用,這個我預計要在30篇以後了吧,後面的套路依舊慢節奏的,所以莫著急了,100篇呢,預計4~5個月寫完,常見的反反爬後面也會寫的,還有fuck login類的內容。

Python爬蟲入門教程 10-100 圖蟲多線程爬

全局變量 app str tlist img exception 父類 json urn 寫在前面 經歷了一頓劈裏啪啦的操作之後,終於我把博客寫到了第10篇,後面,慢慢的會涉及到更多的爬蟲模塊,有人問scrapy 啥時候開始用,這個我預計要在30篇以後了吧,後面的套路依舊慢

Python爬蟲入門教程 12-100 半次元COS圖爬

寫在前面 今天在瀏覽網站的時候,忽然一個莫名的連結指引著我跳轉到了半次元網站 https://bcy.net/ 開啟之後,發現也沒有什麼有意思的內容,職業的敏感讓我瞬間聯想到了 cosplay ,這種網站必然會有這個的存在啊,於是乎,我準備好我的大爬蟲了。 把上面的連結開啟之後

Python爬蟲入門教程,突破煎蛋反爬措施,妹子圖批量

  今天寫一個爬蟲愛好者特別喜歡的網站煎蛋網 ,這個網站其實還是有點意思的,網站很多人寫了N多的教程了,各種方式的都有,當然網站本身在爬蟲愛好者的不斷進攻下,也在不斷的完善,反爬措施也很多,今天我用 selenium 在揍他一波。