您好,登錄后才能下訂單哦!
1. 寫在前面
今天要抓取的一個(gè)網(wǎng)站叫做微醫(yī)網(wǎng)站,地址為 https://www.guahao.com ,我們將通過(guò)python3爬蟲抓取這個(gè)網(wǎng)址,然后數(shù)據(jù)存儲(chǔ)到CSV里面,為后面的一些分析類的教程做準(zhǔn)備。本篇文章主要使用的庫(kù)為pyppeteer 和 pyquery
首先找到 醫(yī)生列表頁(yè)
https://www.guahao.com/expert/all/全國(guó)/all/不限/p5
這個(gè)頁(yè)面顯示有 75952 條數(shù)據(jù) ,實(shí)際測(cè)試中,翻頁(yè)到第38頁(yè),數(shù)據(jù)就加載不出來(lái)了,目測(cè)后臺(tái)程序猿沒(méi)有把數(shù)據(jù)返回,不過(guò)為了學(xué)習(xí),我們?nèi)塘恕?/p>
2. 頁(yè)面URL
https://www.guahao.com/expert/all/全國(guó)/all/不限/p1
https://www.guahao.com/expert/all/全國(guó)/all/不限/p2
...
https://www.guahao.com/expert/all/全國(guó)/all/不限/p38
數(shù)據(jù)總過(guò)38頁(yè),量不是很大,咱只需要隨便選擇一個(gè)庫(kù)抓取就行,這篇博客,我找了一個(gè)冷門的庫(kù)
pyppeteer 在使用過(guò)程中,發(fā)現(xiàn)資料好少,很尷尬。而且官方的文檔寫的也不好,有興趣的可以自行去看看。關(guān)于這個(gè)庫(kù)的安裝也在下面的網(wǎng)址中。
https://miyakogi.github.io/pyppeteer/index.html
最簡(jiǎn)單的使用方法,在官方文檔中也簡(jiǎn)單的寫了一下,如下,可以把一個(gè)網(wǎng)頁(yè)直接保存為一張圖片。
import asyncio from pyppeteer import launch async def main(): browser = await launch() # 運(yùn)行一個(gè)無(wú)頭的瀏覽器 page = await browser.newPage() # 打開一個(gè)選項(xiàng)卡 await page.goto('http://www.baidu.com') # 加載一個(gè)頁(yè)面 await page.screenshot({'path': 'baidu.png'}) # 把網(wǎng)頁(yè)生成截圖 await browser.close() asyncio.get_event_loop().run_until_complete(main()) # 異步
我整理了下面的一些參考代碼,你可以 做一些參考。
browser = await launch(headless=False) # 可以打開瀏覽器 await page.click('#login_user') # 點(diǎn)擊一個(gè)按鈕 await page.type('#login_user', 'admin') # 輸入內(nèi)容 await page.click('#password') await page.type('#password', '123456') await page.click('#login-submit') await page.waitForNavigation() # 設(shè)置瀏覽器窗口大小 await page.setViewport({ 'width': 1350, 'height': 850 }) content = await page.content() # 獲取網(wǎng)頁(yè)內(nèi)容 cookies = await page.cookies() # 獲取網(wǎng)頁(yè)cookies
3. 爬取頁(yè)面
運(yùn)行下面的代碼,你就可以看到控制臺(tái)不斷的打印網(wǎng)頁(yè)的源碼,只要獲取到源碼,就可以進(jìn)行后面的解析與保存數(shù)據(jù)了。如果出現(xiàn)控制不輸出任何東西的情況,那么請(qǐng)把下面的
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} 頁(yè)面") await page.goto("https://www.guahao.com/expert/all/全國(guó)/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()
4. 解析數(shù)據(jù)
解析數(shù)據(jù)采用的是pyquery ,這個(gè)庫(kù)在之前的博客中有過(guò)使用,直接應(yīng)用到案例中即可。最終產(chǎn)生的數(shù)據(jù)通過(guò)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} 頁(yè)面") await page.goto("https://www.guahao.com/expert/all/全國(guó)/all/不限/p{}".format(num)) content = await page.content() self.parse_html(content) print("正在存儲(chǔ)數(shù)據(jù)....") data = pd.DataFrame(self._data) data.to_csv("微醫(yī)數(shù)據(jù).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() # 姓名和級(jí)別 department = item.find(".g-doc-baseinfo>dl>dd>p:eq(0)").text() # 科室 address = item.find(".g-doc-baseinfo>dl>dd>p:eq(1)").text() # 醫(yī)院地址 star = item.find(".star-count em").text() # 評(píng)分 inquisition = item.find(".star-count i").text() # 問(wèn)診量 expert_team = item.find(".expert-team").text() # 專家團(tuán)隊(duì) 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()
總結(jié)一下,這個(gè)庫(kù)不怎么好用,可能之前沒(méi)有細(xì)細(xì)的研究過(guò),感覺(jué)一般,你可以在多嘗試一下,看一下是否可以把整體的效率提高上去。
數(shù)據(jù)清單:
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)億速云的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。