import requests
import re
import json
from multiprocessing import Pool
from multiprocessing import Manager
import time
import functools
# 抓取猫眼TOP100的数据
# 第一步:下载页面
def get_one_page(url):
# 这里也可以导入之前写的User-Agent池
ua_header = {
"User-Agent": 'Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10'}
response = requests.get(url, headers=ua_header)
if response.status_code == 200: # OK
return response.text
return None
# 第二步:提取信息
def parse_one_page(html):
pattern = re.compile(
'<p class="name"[\s\S]*?title="([\s\S]*?)"[\s\S]*?<p class="star">([\s\S]*?)</p>[\s\S]*?<p class="releasetime">([\s\S]*?)</p>')
items = re.findall(pattern, html)
# 使用yield返回给上层
for item in items:
yield{
"title": item[0].strip(),
"actor": item[1].strip(),
"time": item[2].strip()
}
# 第三步:保存到本地系统中
def write_to_file(item):
# 存储成json格式,以便于将来能方便提取出来
with open('maoyanTop100.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(item, ensure_ascii=False) + '\n')
def CrawlPage(lock, offset):
# 将下载页面,解析页面及保存信息放入
url = "http://maoyan.com/board/4?offset=" + str(offset)
html = get_one_page(url)
for item in parse_one_page(html):
lock.acquire() # 加锁
write_to_file(item)
lock.release() # 释放锁
# for i in range(minPage, maxPage, step):
# 每次生成一个入口的URL
time.sleep(1)
minPage = 0
maxPage = 100
step = 10
if __name__ == "__main__":
# 使用进程池来抓取数据
# 进程池之间通信的时候,需要使用Manger;
manager = Manager()
lock = manager.Lock()
newCrawlPage = functools.partial(CrawlPage, lock)
pool = Pool()
pool.map(newCrawlPage, [i * 10 for i in range(10)])
pool.close()
pool.join()
这样运行出来后,就会将前一百的电影数据保存进了txt文本里了,
由于进程池里进程运算速度不同,所以爬取出来的数据可能和网站顺序不同。