本文主要是应用requests+ re 获取猫眼top100 电影的名称,评分,上映时间…等信息。
解析网站:每页显示10个,向下翻页在url后面添加offset=10的倍数
要获取的内容均在<dd 标签里面。
另外,代码中的headers信息可以自行填写,可通过以下方式找到哦:
好了,下面就直接正文代码了,希望对向我这样的初学者有帮助!
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)])