Selenium + Python으로 스크래핑 1

14067 단어 파이썬셀레늄

마지막 회의



전회 Goutte를 사용해 로그인 후의 페이지 정보를 취하려고 하는 것도, 화상 인증에 의해 참패했습니다.
htps : // 이 m/시오하루_/있어 ms/818154 아 c145c78076487

그래서 이번에는 수단을 바꾸고 Selenium + Python으로 스크래핑을 할까 생각합니다!

소개



Windows 10에서 Vagrant, VirtualBox를 사용하여,
가상 환경의 CentOS7.0에 Selenium, Python 및 ChromeDriver를 배포합니다.

선인의 지혜를 참고로 도입했습니다.
htps : // rkぉg. 베/아 r치ゔぇs/3422

사용해보기



sample.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1280,1024')

driver = webdriver.Chrome(options=options)
driver.get('https://www.yahoo.co.jp/')

driver.save_screenshot('test.png')
driver.quit()

막상 실행python sample.py



무사히, yahoo의 톱 페이지가 캡쳐 되었기 때문에 샘플은 괜찮을 것 같네요!

마지막 과제



지난번에는 이미지 인증이 있었고 로그인 후 화면을 표시할 수 없었습니다.
Selenium이라면 대기 처리가 있으므로 그 사이에 수동으로 로그인하면 이미지 인증 페이지에도 갈 수 있을 것!
라고 생각하고 있었습니다만, Chrome의 프로필 패스를 지정해 주는 것으로 지정한 프로필의 상태를 유지해 주는 것을 알았습니다.
htps : // 나비 t 후오 t. xy · 세이 니우 m-ch 로메 - p 로후 ぇ /

결국 미리 수동으로 로그인한 상태의 프로필 경로를 지정해 주면 된다고 하는 것이군요.
그것은 간결하게 되어 고맙다.

이번은 가상 환경의 CentOS를 사용하고 있는 것이므로, 마운트처에 windows환경의 심볼릭 링크를 붙이면 거기로부터 참조해 주는 것은 아니라고 생각했습니다.


mklink /J "C:\Users\[ユーザー名]\Desktop\work\vagrant\User Data" "C:\Users\[ユーザー名]\AppData\Local\Google\Chrome\User Data"

샘플 소스를 다시 작성하여 실행해 봅니다.

sample2.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1280,1024')
options.add_argument('--user-data-dir=シンボリックリンクを貼ったプロフィールパス')

driver = webdriver.Chrome(options=options)
driver.get('https://p.eagate.573.jp/game/2dx/27/ranking/weekly.html')

driver.save_screenshot('test2.png')
driver.quit()

그런데 꽤



거기에는 무자비하게 비 로그인 상태의 이미지가 캡처되었습니다 ...



원인으로는 역시 프로필 경로의 참조가 잘 되어 있지 않았습니다.
가상 환경에 설치하고 있는 chrome의 프로필과 windows측의 chrome의 프로필의 차이 등이 있으니까요…
그래서 무리하게 가상 환경에서 묶는 의미도 특별히 없기 때문에 윈도우 측에 Python과 Selenium을 도입하여 실행하고 싶습니다.

Windows 측 환경 설정



참고 : h tps://my ぃふぇ8. 네 t / an s ta l-se 니 m an d u r-on-u und ws /

파이썬



htps //w w. py 응. 오 rg / 도 w 응 아 ds /
인스톨러에 따를 뿐이므로 특기사항 없음

셀레늄



Python 배포 후 명령 프롬프트에서 다음 실행으로 설치할 수 있습니다.pip install selenium

ChromeDriver



htps : // / s. 오, ぇ. 코 m/아/ch 로미우 m. 오 rg / ch rome dri ゔ ぇ r / w
Chrome 버전과 동일한 ChromeDriver를 다운로드합니다.
chromedriver.exe의 위치는 어디서나 좋지만, 쉽게 Python과 같은 위치에 넣었습니다.C:\Users\[ユーザー名]\AppData\Local\Programs\Python\Python38\chromedriver.exe
환경 변수의 PATH도 위에서 설정했습니다.

windows 측에서 실행



미리 Chrome에서 htps: //p. 그래. 573. jp / game / 2dx / 27 / rankin g / uee kly. HTML로 로그인 한 후,
Chrome을 닫아 둡시다.
소스를 아래에 다시 작성 실행!

sample3.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1280,1024')
options.add_argument('--user-data-dir=C:\\Users\\[ユーザー名]\\AppData\\Local\\Google\\Chrome\\User Data')

driver = webdriver.Chrome(options=options)
driver.get('https://p.eagate.573.jp/game/2dx/27/ranking/weekly.html')

driver.save_screenshot('test3.png')
driver.quit()

안전하게 잡혔습니다!


실제로 원하는 부분은 랭킹의 부분이므로 랭킹의 부분에 도달할 수 있는지 실험.
원하는 부분을 표시하기 위해 클릭을 하거나 페이지 위치를 조절해 봅니다.

sample4.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1280,1024')
options.add_argument('--user-data-dir=C:\\Users\\[ユーザー名]\\AppData\\Local\\Google\\Chrome\\User Data')

driver = webdriver.Chrome(options=options)
driver.get('https://p.eagate.573.jp/game/2dx/27/ranking/weekly.html')
driver.find_element_by_xpath("/html/body/div/div[1]/div/div/div[2]/div/div[2]/form/div[2]/ul[1]/li[3]/input").click()
time.sleep(3)

driver.execute_script("window.scrollTo(0, 800)")
time.sleep(3)

driver.save_screenshot('sample.png')
driver.quit()

괜찮아요!


총평


  • 드디어 화상 인증이 필요한 페이지를 스크래핑하는 곳까지 도착했습니다.
  • 이번은 캡쳐였지만 다음번은 실제로 데이터를 취득해 가공해 나가려고 합니다.
  • 좋은 웹페이지 즐겨찾기