python 파충류 사례: 고양이 눈 영화 Top 10 영화 관련 정보 (코드 초 상세 해석)

6900 단어 파충
대상 주소:http://www.maoyan.com/board/4
Top 100 차 트 는 모두 10 페이지 로 나 뉘 는데 관찰 을 통 해 각 페이지 의 URL 은 get 요청 매개 변수 offset 변화 와 구별 된다.
그래서 URL 은 다음 과 같 습 니 다:
url = 'http://www.maoyan.com/board/4?offset=' + str(page_num)

한 페이지 의 html 코드 를 가 져 와 함수 로 쓰 십시오:
#      html
def get_one_page(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'
    }
    # requests.get(url,headers)            ,         
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    return None

저희 가 캡 처 한 내용 은 6 가지 입 니 다. 차 트 번호, 사진 주소, 영화 이름, 배우, 상영 시간 (국가), 득점 입 니 다.
python爬虫小例子:爬取猫眼电影Top10电影相关信息(代码超详细解读)_第1张图片
관찰 한 결과 모든 영화 의 정 보 는 html 의 탭 에 있 습 니 다. 다음 과 같 습 니 다.
python爬虫小例子:爬取猫眼电影Top10电影相关信息(代码超详细解读)_第2张图片
정규 표현 식 을 사용 하여 우리 가 필요 로 하 는 정보 에 대한 해석 함 수 는 다음 과 같 습 니 다.
#        ,              
def parse_one_page(html):
    #       
.*?board-index.*?>(.*?) # data-src="(.*?)" # (.*?) # (.*?) # (.*?) # (.*?)(.*?) pattern = re.compile('
.*?board-index.*?>(.*?).*?data-src="(.*?)".*?(.*?).*?(.*?).*?(.*?).*?(.*?)(.*?).*?
',re.S) items = re.findall(pattern,html) for item in items: # yield , (generator), # iterable , 。 # yield , , 。 # , , 。 # for , 。 , 。 yield { 'index':item[0].strip(), 'image':item[1].strip(), 'title':item[2].strip(), 'actor':item[3].strip()[3:] if len(item[3])>3 else '', 'time':item[4].strip()[5:] if len(item[4])>5 else '', 'score':item[5].strip() + item[6].strip() }

그리고 우리 가 얻 은 정 보 를 txt 파일 에 기록 하고 모든 영화 정 보 를 기록 하 는 함 수 는 다음 과 같 습 니 다.
#         ,      
def write_one_movie(content):
    with open('maoyanResult.txt','a',encoding='utf-8') as f:
        #      JSON    dumps()          ,
        #    ensure_ascii     False,                   Unicode   
        # print(type(json.dumps(content)))
        f.write(json.dumps(content,ensure_ascii=False) + '
') # , str() # f.write(str(content) + '
')

그 다음 에 상기 세 개의 함 수 를 모 아서 한 페이지 의 데 이 터 를 얻 는 총 제어 함 수 를 얻 을 수 있 습 니 다.
#             
def main_one_page(page_num):
    maoyan_url = 'http://www.maoyan.com/board/4?offset=' + str(page_num)
    html = get_one_page(maoyan_url)
    for item in parse_one_page(html):
        write_one_movie(item)

마지막 으로 통합 하여 페이지 별로 올 라 가서 Top 100 을 모두 내 려 옵 니 다.
if __name__ == '__main__':
    if os.path.exists('maoyanResult.txt'):
        os.remove('maoyanResult.txt')
    for i in range(0,99,10):
        print('      {}   ...'.format(int(i/10 + 1)))
        main_one_page(i)
        time.sleep(1)

최종 결 과 는 다음 과 같다.

 
최종 코드 통합
import requests
import re
import json
import os
import time

#      html
def get_one_page(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'
    }
    # requests.get(url,headers)            ,         
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    return None

#        ,              
def parse_one_page(html):
    #       
.*?board-index.*?>(.*?) # data-src="(.*?)" # (.*?) # (.*?) # (.*?) # (.*?)(.*?) pattern = re.compile('
.*?board-index.*?>(.*?).*?data-src="(.*?)".*?(.*?).*?(.*?).*?(.*?).*?(.*?)(.*?).*?
',re.S) items = re.findall(pattern,html) for item in items: # yield , (generator), # iterable , 。 # yield , , 。 # , , 。 # for , 。 , 。 yield { 'index':item[0].strip(), 'image':item[1].strip(), 'title':item[2].strip(), 'actor':item[3].strip()[3:] if len(item[3])>3 else '', 'time':item[4].strip()[5:] if len(item[4])>5 else '', 'score':item[5].strip() + item[6].strip() } # , def write_one_movie(content): with open('maoyanResult.txt','a',encoding='utf-8') as f: # JSON dumps() , # ensure_ascii False, Unicode # print(type(json.dumps(content))) f.write(json.dumps(content,ensure_ascii=False) + '
') # , str() # f.write(str(content) + '
') # def main_one_page(page_num): maoyan_url = 'http://www.maoyan.com/board/4?offset=' + str(page_num) html = get_one_page(maoyan_url) for item in parse_one_page(html): write_one_movie(item) if __name__ == '__main__': if os.path.exists('maoyanResult.txt'): os.remove('maoyanResult.txt') for i in range(0,99,10): print(' {} ...'.format(int(i/10 + 1))) main_one_page(i) time.sleep(1)

좋은 웹페이지 즐겨찾기