Python 마이크로 의학 등기 망 의사 데이터 캡 처
오늘 캡 처 할 사 이 트 는 마이크로 의학 사이트 라 고 합 니 다.주 소 는 https://www.guahao.com 입 니 다.저 희 는 python 3 파충류 로 이 사 이 트 를 캡 처 한 다음 에 데 이 터 를 CSV 에 저장 하여 뒤의 분석 류 의 강 좌 를 준비 할 것 입 니 다.이 글 에서 주로 사용 하 는 라 이브 러 리 는 pyppeter 와 pyquery 입 니 다.
우선 의사 목록 페이지 를 찾 아 보 세 요.
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/무제 한
...
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()
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()
요약 하면 이 라 이브 러 리 는 그다지 좋 지 않 습 니 다.예전 에 자세히 연구 한 적 이 없 을 수도 있 습 니 다.느낌 이 별로 인 것 같 습 니 다.다시 한 번 시도 해 보 세 요.전체적인 효율 을 향상 시 킬 수 있 는 지 확인 해 보 세 요.데이터 목록:
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.