지금은 수요가 크롤링,이 http://www.chinaooc.cn/front/show_index.htm 모든 코스 데이터를.
데이터 페이징 때문에,를 크롤링하는 종래의 방법에있어서, 가능하지 않다 :
열쇠는 모든 파충류는 데이터의 첫 페이지를 크롤링 그래서, 브라우저의 주소 표시 줄이 일정, 처음 몇 페이지인지 여부입니다. 새로운 데이터에 대한 정보를 얻으려면 F12를 클릭하기 위해, 페이지의 소스 코드를 볼 수, 당신은 JS가 동적으로로드 사용하여 데이터,하지만 주소 만 skipToPage (..) 함수를 찾을 수 있습니다.
그래서, 솔루션입니다 :
- 헤더 및 폼 데이터를 포함하는, 요청 된 정보를 획득 (폼 정보)
- 아날로그 요청 된 데이터를 얻기
- 데이터 분석 결과 얻어진
다음 구현 단계 :
페이지 네트워크 -> XHR이 경우, 점프 버튼 클릭을 다음과 같이 선택도 콘솔에 도시 된 바와 같이, 요구 정보를 취득 1. 콘솔 발행 요구되며, 그리고 선택하고 파일 요청 (제 3 단계)을 선택하고, 헤더 아래 요청 헤더 정보이다.
제 2 헤더는 상기 제 데이터 요청이다 헤더 부분에서 발견 파이썬 시뮬레이션 요구 요청을 사용.
그런 다음 폼 데이터를 찾을 수
위의 내용을 복사 한 다음 코드가 형성된다
헤더 = { ' 동의 ' : ' text / html과, * / *; Q = 0.01 ' , ' 인코딩을 수락 ' : ' gzip을, 폐의 ' , ' - 언어 수락 ' : ' 에서 zh-CN,에서 zh, Q = 0.9, 욕실, Q = 0.8, 코, Q = 0.7 ' , ' 연결 ' : ' 연결 유지 ' , ' 콘텐츠 길이 ' : ' 61 ' , ' 쿠키 ' : ' 경로 = bd118df546101f9fcee5c1a58356a008; JSESSIONID = 047BD79E9754BAED525EFE860760393E ' , ' 호스트 ' : ' www.chinaooc.cn ' , ' 원산지 ' : ' http://www.chinaooc.cn를 ' , ' 에서 Pragma ' :' , ' 리퍼러 ' : ' http://www.chinaooc.cn/front/show_index.htm ' , ' 사용자 에이전트 ' : ' 모질라 / 5.0 (윈도우 NT 10.0; WOW64) AppleWebKit / 537.36 (KHTML, 도마뱀 붙이 등) 크롬 / 63.0.3239.84 사파리 / 537.36 ' , ' X-요청한와 ' : ' XMLHttpRequest 객체 ' , ' 콘텐츠 유형 ' : ' 을 application / x-www-form-urlencoded를; 캐릭터 = UTF-8 " } form_data = { ' pager.pageNumber ' : ' 2 ' , ' pager.pageSize ' : ' 50 ' , ' pager.keyword ' : ' , ' 모드 ' : ' 페이지 ' }
다음 아날로그 전송 요청 form_data 다른 페이지 데이터의 각각의 변화를 얻을 수있다 :
form_data [ ' pager.pageNumber는 ' ] = 회 URL = " http://www.chinaooc.cn/front/show_index.htm ' 응답 = requests.post (URL 데이터 = form_data 헤더 = 헤더)
도 3은, 정보의 분석 데이터를 얻는 반응에 반환.
다음과 같이 전체 코드는 다음과 같습니다
# !는 / usr / 빈 / ENV 파이썬 # - * - 코딩 : UTF-8 - * - 수입 요청이 가져올 재 에서 BS4의 수입 BeautifulSoup로 클래스 항목 : 데프 __init__ (자기) : selfnum = 0 self.school = '' self.clazz = '' self.url = '' 헤더 = { ' 동의 ' : ' text / html과, * / *; Q = 0.01 ' , ' 인코딩을 수락 ' : ' gzip을, 폐의 ' , ' - 언어 수락 ' : ' 에서 zh-CN,에서 zh, Q = 0.9, 욕실, Q = 0.8, 코, Q = 0.7 ' ,
' 연결 ' : ' 연결 유지 ' , ' 콘텐츠 길이 ' : ' 61 ' , ' 쿠키 ' : ' 경로 = bd118df546101f9fcee5c1a58356a008; JSESSIONID = 047BD79E9754BAED525EFE860760393E ' , ' 호스트 ' : ' www.chinaooc.cn ' , ' 원산지 ' : ' http://www.chinaooc.cn를 ' , ' 에서 Pragma ' :' , ' 리퍼러 ' : ' http://www.chinaooc.cn/front/show_index.htm ' , ' 사용자 에이전트 ' : ' 모질라 / 5.0 (윈도우 NT 10.0; WOW64) AppleWebKit / 537.36 (KHTML, 도마뱀 붙이 등) 크롬 / 63.0.3239.84 사파리 / 537.36 ' , ' X-요청한와 ' : ' XMLHttpRequest 객체 ' , ' 콘텐츠 유형 ' : ' 을 application / x-www-form-urlencoded를; 캐릭터 = UTF-8 " } form_data = { ' pager.pageNumber ' : ' 2 ' , ' pager.pageSize ' : ' 50 ' , ' pager.keyword ' : ' , ' 모드 ' : ' 페이지 ' } 시간 = 20 동안 시간 <34 : form_data [ ' pager.pageNumber는 ' ] = 회 URL = " http://www.chinaooc.cn/front/show_index.htm ' 응답 = requests.post (URL 데이터 = form_data 헤더 = 헤더) 수프 = BeautifulSoup로 (response.content, " html.parser " ) tr_list = soup.find_all ( " TR " ) my_tr_list = tr_list [1 -1 ] 대한 TR 에 my_tr_list : td_list = tr.find_all ( ' TD ' ) = 항목 () a.num = td_list [0] .contents [0] a.school = td_list [1 ] .contents [0] a.clazz = td_list [2] .contents [0] .replace ( ' \' ' , ' ' ) a.url = td_list [5] .find_all ( ' ' ) [0] [ " HREF " ] #에 이름 = 개방 (와 ' E / 데이터 / ' + ' [ ' + a.num + ' ] ' + A .school + ' ] ' + a.clazz + ' ] .html 중에서 ' , ' WB ' F 등) 입술 = requests.get (a.url) res.encoding = res.apparent_encoding f.write (res.content) 시간 = 1 시간 +