첫째, 사고 분석
현재 잡을 수 있는 방법은 다음과 같습니다.
1. 위챗 앱에서 직접 위챗 위챗 공식 계정 문장 링크를 캡처합니다 (/s? _ _ biz = mjm 5 mzu 4 odk 2ma = = & amp;; Mid=2735446906. Idx= 1 입니다. Sn = ece37 deaba 0c8 ebb9 badf 07e5a3bd3 & 장면 =0#rd)
2. 위챗 파트너 써우거우 검색 엔진 (/) 을 통해 해당 요청을 보내 간접적으로 캡처합니다.
1 법에서는 이런 링크를 쉽게 얻을 수 없고, 그 규칙도 특별히 명확하지 않다.
따라서 이 문서에서는 weixin.sogou.com 에 인스턴트 요청을 전송하여 캡처된 데이터를 실시간으로 분석하고 로컬에 저장하는 방법 2 를 사용합니다.
2. 크롤링 프로세스
1. 먼저 써우거우 위챗 검색 페이지에서 테스트해 보겠습니다. 그러면 우리의 사고방식이 더욱 명확해집니다.
위챗 위챗 공식 계정을 사용하여 검색 엔진에 있는 영어 이름' 검색 위챗 공식 계정' (위챗 공식 계정의 영어 이름은 위챗 공식 계정에서 고유하고 중국어 이름은 중복될 수 있기 때문에 위챗 공식 계정의 이름은 완전히 정확해야 합니다. 그렇지 않으면 많은 것을 발견할 수 있어 데이터 필터링 작업을 줄일 수 있습니다. 이 고유 영어 이름에 해당하는 데이터만 찾으면 됩니다 Type =1& 쿼리 =% s & ampie = utf8 & amp _ sug _ = n& _ sug _ type _ ='%? 파이썬' 을 통해 검색 결과 위챗 공식 계정에 해당하는 홈페이지 점프 링크를 페이지에서 확인할 수 있습니다.
2. 홈페이지 항목 내용 가져오기
요청, urllib, urllib2 를 사용하거나 webdriver+phantomjs 등을 직접 사용합니다.
여기서는 request.get () 메서드를 사용하여 포털 페이지의 내용을 가져옵니다.
[파이썬]? 평원을 구경하다? 복사
#? 크롤러 위장 헤드 장치
Self.headers? =? {'사용자 에이전트':? 모질라/5.0? (윈도우즈? NT? 6.3; -응? WOW64? Rv:5 1.0)? 도마뱀붙이 /20 100 10 1? Firefox/5 1.0'}
#? 작업 시간 초과 시간을 설정합니다.
Self. 시간 초과? =? 다섯;오;5
#? Crawler 시뮬레이션은 request.session 에서 수행됩니다
Self.s? =? 요청하다. 세션 ()
[파이썬]? 평원을 구경하다? 복사
# 포털 주소 검색, 대중을 키워드로 위챗 공식 계정 검색?
Def? Get_search_result_by_keywords (자체):
Self.log ('검색 주소: %s'? %? Self.sogou_search_url)
반환? Self.s.get (self.써우거우 _ 검색 _ URL,? Headers=self.headers,? Timeout=self.timeout) 입니다. 내용
세 번째 단계는 위챗 공식 계정 주소를 얻는 것입니다.
얻은 웹 콘텐츠에서 위챗 공식 계정의 홈 주소를 얻는 방법에는 여러 가지가 있습니다. 예를 들어 beautifulsoup, webdriver, Regularity 직접 사용, pyquery 등이 있습니다.
여기에 pyquery 를 사용하여 위챗 공식 계정 홈페이지의 포털 주소를 찾습니다.
[파이썬]? 평원을 구경하다? 복사
# 위챗 공식 계정 홈 페이지 주소 얻기
Def? Get _ wx _ URL _ by _ Sogou _ search _ html (self, Sogou _ search _ html):
의사. =? Pq (구매 _ 검색 _html)
# 인쇄? Doc ('p [클래스 = "tit"]') ('a'). 특성 ('href')
# 인쇄? Doc('div[class=img-box]')('a'). 특성 ('href')
# pyquery 로 웹 콘텐츠를 처리하는 것은 beautifulsoup 을 사용하는 것과 비슷하지만 pyquery 와 jQuery 는 비슷한 방식으로 위챗 공식 계정의 홈 주소를 찾습니다.
반환? Doc ('div [class = txt-box]') ('p [class = tit]') ('a'). 특성 ('href')
4. 위챗 공식 계정 홈 페이지 문장 목록을 얻습니다.
먼저 위챗 공식 계정 홈페이지를 로드해야 합니다. 이 홈 페이지의 내용은 js 렌더링 및 로드가 필요하기 때문에 phantomjs+webdriver 를 사용합니다. 이전 방법으로는 정적 웹 콘텐츠만 얻을 수 있습니다.
[파이썬]? 평원을 구경하다? 복사
# webdriver 사용? 위챗 공식 계정 홈페이지의 내용을 로드합니다. 주로 js 렌더링 부분입니다.
Def? Get_selenium_js_html(self,? Url):
브라우저? =? 웹 드라이버. PhantomJS ()?
Browser.get (웹 사이트)?
Time.sleep(3)?
#? Js 를 실행하여 전체 페이지 내용을 가져옵니다.
Html? =? Browser.execute_script("return? Document.documentelement.outer html ") 을 참조하십시오
반환? 하이퍼텍스트 마크업 언어
홈페이지의 내용을 얻은 후, 우리가 필요로 하는 내용이 들어 있는 문장 목록을 얻는다.
[파이썬]? 평원을 구경하다? 복사
# 위챗 공식 계정의 문장 내용 얻기
Def? Parse_wx_articles_by_html(self,? Selenium_html):
의사. =? Pq (셀레늄 html)
인쇄? 컨텐츠 메시지 찾기 시작
반환? Doc('div[class="weui_media_box? Appmsg"]')
# 일부 위챗 공식 계정은 10 개, 일부는 더 많을 수 있습니다.
# 컴백? Doc ('div [class = "weui _ msg _ card"]') # 위챗 공식 계정은 10 개밖에 없다.
5. 각 문장 목록을 분석하여 필요한 정보를 얻습니다.
6. 해당 내용을 처리합니다
문장 이름, 주소, 소개, 발표 시간 등이 포함됩니다.
7. 문장 내용을 저장합니다
로컬에 html 형식으로 저장합니다.
또한 이전 단계의 내용을 excel 형식으로 저장합니다.
8. JSON 데이터를 저장합니다
이런 식으로, 각 단계가 분할 된 후에, 위챗 공식 계정을 붙잡는 문장 또한 특히 어렵지 않다.
셋째, 소스 코드
첫 번째 버전의 소스 코드는 다음과 같습니다.
[파이썬]? 평원을 구경하다? 복사
#! /usr/bin/파이썬
#? 인코딩:? Utf-8
수입? [카운트] 시스템 복제 명령 (시스템 약어)
다시 로드 (시스템)
Sys.setdefaultencoding('utf-8')
어디서 왔어요? Urllib? 수입? 인용
어디서 왔어요? Pyquery? 수입? PyQuery? 로? 체력상수
어디서 왔어요? 셀레늄? 수입? 네트워크 드라이브
수입? 요구하다
수입? 시간
수입? 정보
수입? Json
수입? 운영 체제 (운영 체제)
반? 위챗 _ 거미:
Def? __init__(self, 킬로와트):
-응? "건축자"
Self.kw? =? 킬로와트
#? 소호 위챗 검색 링크
#self.sogou_search_url? =? 위신? Type =1& 쿼리 =% s & ampie = utf8 & amp _ sug _ = n& _ sug _ type _ ='? %? 견적 (자기 킬로와트)
Self.sogou_search_url? =? 위신? Type =1& 질의 =% s & ampie = utf8 & amp 입력 & amp= n & amp_sug_type_='? %? 견적 (자기 킬로와트)
#? 파충류 위장
Self.headers? =? {'사용자 에이전트':? 모질라/5.0? (윈도우즈? NT? 10.0; -응? WOW64? Rv:47.0)? 도마뱀붙이 /20 100 10 1? FirePHP/0refox/47.0? FirePHP/0.7.4. 1'}
#? 작업 시간 초과 기간
Self. 시간 초과? =? 다섯;오;5
Self.s? =? 요청하다. 세션 ()
Def? Get_search_result_by_kw (자체):
Self.log ('검색 주소: %s'? %? Self.sogou_search_url)
반환? Self.s.get (self.써우거우 _ 검색 _ URL,? Headers=self.headers,? Timeout=self.timeout) 입니다. 내용
Def? Get _ wx _ URL _ by _ Sogou _ search _ html (self, Sogou _ search _ html):
-응? 반환된 sougou_search_html 에 따라 위챗 공식 계정 홈 페이지 링크를 받습니까?'
의사. =? Pq (구매 _ 검색 _html)
# 인쇄? Doc ('p [클래스 = "tit"]') ('a'). 특성 ('href')
# 인쇄? Doc('div[class=img-box]')('a'). 특성 ('href')
# pyquery 로 웹 콘텐츠를 처리하는 것은 beautifulsoup 을 사용하는 것과 비슷하지만 pyquery 와 jQuery 는 비슷한 방식으로 위챗 공식 계정의 홈 주소를 찾습니다.
반환? Doc ('div [class = txt-box]') ('p [class = tit]') ('a'). 특성 ('href')
Def? Get_selenium_js_html(self,? Wx_url):
-응? Js 렌더링 컨텐츠 실행 및 렌더링된 html 컨텐츠 반환?'
브라우저? =? 웹 드라이버. PhantomJS ()?
Browser.get(wx_url)?
Time.sleep(3)?
#? Js 를 실행하여 전체 DOM 을 얻을 수 있습니까?
Html? =? Browser.execute_script("return? Document.documentelement.outer html ")
반환? 하이퍼텍스트 마크업 언어
Def? Parse_wx_articles_by_html(self,? Selenium_html):
-응? Selenium_html 에서 위챗 위챗 공식 계정 문장 구문 분석?'
의사. =? Pq (셀레늄 html)
반환? Doc ('div [클래스 = "weui _ msg _ card"]')
Def? Switch _ arcticles _ to _ list(self, 문장):
-응? 문장 데이터 사전으로 변환?
문장 _ 목록? =? []
나? =? 1
만약? 문장:
뭐 때문에? 문장? 네? Articles.items ():
Self.log (u' start integration (%d/%d)'? %? 나,? Len (문장)))
Articles _ list.append (self.parse _ one _ article (article))
나? +=? 1
#? 파열
반환? 문장 _ 목록
Def? Parse_one_article(self,? 문장):
-응? 문장 분석?
문장 _ 사전? =? {}
문장? =? 문장 ('. Weui_media_box[id]')
제목? =? 문장 ('H4 [클래스 = "weui _ media _ title"]'). 텍스트 ()
Self.log ('제목은:? %s' 을 (를) 사용하시겠습니까? %? 제목)
웹사이트 주소? =? '? +? 문장 ('H4 [클래스 = "weui _ media _ title"]'). 속성 ('hrefs')
Self.log ('주소:? %s' 을 (를) 사용하시겠습니까? %? 웹 주소)
요약? =? 문장 ('. Desc 미디어 협회). 텍스트 ()
Self.log ('문장 소개:? %s' 을 (를) 사용하시겠습니까? %? 요약)
데이트? =? 문장 ('. Weui _ media _ extra _ info') 를 참조하십시오. 텍스트 ()
Self.log ('게시 위치:? %s' 을 (를) 사용하시겠습니까? %? 날짜)
Pic? =? Self.parse_cover_pic (문장)
내용? =? Self.parse_content_by_url (웹 사이트). Html ()
Contentfiletitle = self.kw+'/'+title+'_'+date+'.' Html'
Self.save_content_file (컨텐트 파일 제목, 컨텐트)
반환? {
제목': 제목,
Url': URL,
요약': 요약,
날짜': 날짜,
Pic ':pic,
컨텐트': 컨텐트
}
Def? Parse_cover_pic(self,? 문장):
-응? 문장 표지 그림 분석?'
Pic? =? 문장 ('. Weui _ media _ HD') 를 참조하십시오. 속성 ('스타일')
P? =? 다시 컴파일 (r'background-image:url (. )' 을 참조하십시오
Rs? =? P.findall (그림)
Self.log (? 표지 사진은 %s 입니까? -응? %? Rs[0]? 만약? 린 (RS)? & gt? 0? "그렇지 않으면")
반환? Rs[0]? 만약? 린 (RS)? & gt? 0? 그렇지 않으면요? ' 을 (를) 클릭합니다
Def? Parse_content_by_url(self, URL):
-응? "문장 상세 내용 아세요?"
페이지 _ html? =? Self.get_selenium_js_html (웹 사이트)
반환? Pq (페이지 _ html) ('# js _ 컨텐트')
Def? Save_content_file (자신, 제목, 내용):
-응? 페이지 내용을 파일에 쓰시겠습니까?'
무엇을 사용합니까? 열기 (제목,? W')? 로? 여자:
F.write (콘텐츠)
Def? Save_file(self, 내용):
-응? 파일에 데이터 쓰기?'
무엇을 사용합니까? Open(self.kw+'/'+self.kw+'.' Txt',? W')? 로? 여자:
F.write (콘텐츠)
Def? 로그 (자신,? MSG):
-응? "사용자 지정 로그 기능?"
인쇄? U `% s:? %s' 을 (를) 사용하시겠습니까? %? (time.strftime('%Y-%m-%d? %H:%M:%S'),? MSG)
Def? _ 검증 필요 (자체, selenium_html):
-응? 때때로 상대방은 IP 를 차폐한다. Html 에 id=verify_change 의 태그가 포함되어 있는지 여부를 판단해 보겠습니다. 그렇다면 리디렉션된 것입니다. "나중에 다시 시도하도록 상기시켜주세요."
반환? Pq (selenium _ html) ('# verify _ change'). Text ()? ! =? ' 을 (를) 클릭합니다
Def? 디렉터리 만들기 (자신):
폴더 생성'
만약? 그렇지 않나요? Os.path.exists(self.kw):
Os.makedirs(self.kw)?
Def? 실행 (자체):
-응? 파충류 입구 기능? "
# 단계? 0? : 위챗 공식 계정의 이름을 딴 폴더를 만듭니다.
Self.create_dir ()
#? 한 걸음? 1: 써우거우 위챗 엔진에 대한 요청을 가져옵니다. 위챗 위챗 공식 계정의 영어 이름을 쿼리 키워드로 사용합니다.
Self.log(u' 시작 get, 위챗 위챗 공식 계정 영어 이름: %s'? %? Self.kw) 를 참조하십시오
Self.log(u' 써우거우 검색 엔진 호출 시작')
Sougou_search_html? =? Self.get_search_result_by_kw ()
#? 한 걸음? 2. 검색 결과 페이지에서 위챗 공식 계정 홈페이지 링크를 분석합니다.
Self.log(u' 는 sougou_search_html 을 성공적으로 획득하고 위챗 공식 계정에 해당하는 홈페이지 wx_url' 을 수집하기 시작했습니다.)
Wx_url? =? Self.get _ wx _ URL _ by _ sogou _ search _ html (sogou _ search _ html)
Self.log(u' 가 wx_url, %s' 을 (를) 성공적으로 가져왔습니까? %? Wx_url)
#? 한 걸음? 3: 3:Selenium+PhantomJs Js 비동기적으로 로드된 렌더링 html 을 가져옵니다.
Self.log(u' 는 selenium 을 호출하여 html' 을 렌더링하기 시작)
셀레늄 _html? =? Self.get _ selenium _ js _ html (wx _ URL)
#? 한 걸음? 4:? 대상 웹 사이트가 차단되었는지 감지합니다.
만약? Self.need_verify(selenium_html):
Self.log(u' crawler 는 대상 사이트에 의해 차단되었습니다. 나중에 다시 시도하십시오.')
그렇지 않은 경우:
#? 한 걸음? 5:? PyQuery 사용, 단계에서? 3. 획득한 html 에서 위챗 공식 계정의 문장 목록 데이터를 분석합니다.
Self.log(u' 는 selenium 을 호출하여 html 을 렌더링하고 위챗 공식 계정의 문장 확인을 시작합니다.)
문장? =? Self.parse _ wx _ articles _ by _ html (selenium _ html)
Self.log (%d 편의 위챗 문장 있어요)? %? Len (문장))
#? 한 걸음? 6:? 위챗 문장 데이터를 사전 목록으로 캡슐화합니다
Self.log(u' 는 위챗 문장 데이터를 사전으로 통합하기 시작')
문장 _ 목록? =? Self.switch _ arctiles _ to _ list (문장)
#? 한 걸음? 7:? 단계? 5 의 사전 목록이 Json 으로 변환됩니다
Self.log(u' 통합 완료, JSON 으로 변환 시작')
Data_json? =? Json.dumps(articles_list)
#? 한 걸음? 8:? 서류를 쓰다
Self.log(u' 는 JSON 으로 변환되고 JSON 데이터는 file' 로 저장됨).
Self.save_file
Self.log(u' 저장 완료, 프로그램 종료')
#? 주요
만약? __name__? = =? __main__':
Gongzhonghao=raw_input(u' 위챗 공식 계정 등반').
만약? 그렇지 않나요? 궁중호:
공중번호 =' 파이썬 6359'
Weixin_spider (공 중호). 실행 ()
코드의 두 번째 버전:
코드 최적화 및 수정, 주로:
1. excel 저장소가 추가되었습니다.
2. 문장 콘텐츠를 가져오는 규칙을 수정합니다.
3. 노트를 풍성하게 했다
이 프로그램에는 알려진 결함이 있습니다. 위챗 공식 계정의 문장 안에 비디오가 포함되어 있으면 오류가 보고될 수 있습니다.
[파이썬]? 평원을 구경하다? 복사
#! /usr/bin/파이썬
#? 인코딩:? Utf-8