Python 마이크로 의학 등기 망 의사 데이터 캡 처

1.앞 에 쓴다
오늘 캡 처 할 사 이 트 는 마이크로 의학 사이트 라 고 합 니 다.주 소 는 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()
요약 하면 이 라 이브 러 리 는 그다지 좋 지 않 습 니 다.예전 에 자세히 연구 한 적 이 없 을 수도 있 습 니 다.느낌 이 별로 인 것 같 습 니 다.다시 한 번 시도 해 보 세 요.전체적인 효율 을 향상 시 킬 수 있 는 지 확인 해 보 세 요.
데이터 목록:

총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.

좋은 웹페이지 즐겨찾기