python爬虫 爬取猫眼top100

时间:2024-03-23 10:56:17

本文主要是应用requests+ re 获取猫眼top100 电影的名称,评分,上映时间…等信息。

解析网站:每页显示10个,向下翻页在url后面添加offset=10的倍数
要获取的内容均在<dd 标签里面。
python爬虫 爬取猫眼top100

另外,代码中的headers信息可以自行填写,可通过以下方式找到哦:
python爬虫 爬取猫眼top100
好了,下面就直接正文代码了,希望对向我这样的初学者有帮助!

import requests
from requests.exceptions import RequestException
import re
from multiprocessing import Pool  # 多线程运行
import json
# import os


def get_one_page(url):
    try:
        headers = {'User-Agent': '...'}
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None


def parse_one_url(html):
    pattern = re.compile('<dd>.*?board-index.*?(\d+)</i>.*?data-src="(.*?)".*?name"><a.*?>(.*?)</a>.*?'
               +'class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>.*?class="integer">(.*?)</i>.*?'
                +'class="fraction">(\d+)</i>.*?</dd>', re.S)
    items = re.findall(pattern, html)
   # print(items)
    for item in items:
       yield{
           'index': item[0],
           'image': item[1],
           'title': item[2],
           'actor': item[3].strip()[3:],
           'time': item[4].strip()[5:],
           'score': item[5]+item[6]
       }


def write_to_file(content):
    ''' encoding = 'utf-8'  ensure_ascii = False显示中文
    dumps是将dict转化成str格式,loads是将str转化成dict格式。
    当再次使用“w”方式在文件中写数据,所有原来的内容都会被删除。如果想保留原来的内容,可以使用“a”方式在文件中结尾附加数据:'''
    # if os.path.isfile('result.txt'):
    #     os.remove('result.txt')
    with open('result.txt', 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + '\n')
        f.close()

''' 只输出top10的电影
def main():
     url = 'http://maoyan.com/board/4?'
     html = get_one_page(url)
     for item in parse_one_url(html):
         print(item)
         write_to_file(item)'''


# 引入offset参数,将top100的电影都输出
def main(offset):
    url = 'http://maoyan.com/board/4?offset=' + str(offset)
    html = get_one_page(url)
    for item in parse_one_url(html):
        print(item)
        write_to_file(item)


# if __name__ == '__main__':
#     for i in range(10):
#         main(i*10)


if __name__ == '__main__':
    pool = Pool()
    pool.map(main, [i*10 for i in range(10)])