import requests
import re
import json
from multiprocessing import Pool
from multiprocessing import Manager
import time
import functools #函数的包装器

# 抓取猫眼TOP100的数据
# 第一步:下载页面
def get_one_page(url):
    # 设置UA
    ua_header = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/53"}
    response = requests.get(url, headers=ua_header)
    if response.status_code == 200:#OK
       return response.text
    return None

# 第二步:提取信息
def parse_one_page(html):
    # 使用正则表达式的懒惰+findall的模式来提取信息

    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')

#0-100: 0,10,20,...,90
#http://maoyan.com/board/4?offset=
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() #释放锁

if __name__ == "__main__":
    # 使用进程池来抓取数据
    # 在进程池之间通信或者加锁时需要用Manager
    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()

效果:

最新文章

  1. 关于开启.NET在线提升教育培训的通知! - 可在此页面观看在线直播!
  2. 电信计费业务:预后融合OCS到底应该实扣还是虚扣?
  3. 警告 “util.NativeCodeLoader: Unable to load native-hadoop library for your platform”
  4. 加州大学伯克利分校Stat2.3x Inference 统计推断学习笔记: Section 2 Testing Statistical Hypotheses
  5. 【EM算法】EM(转)
  6. magento 图片缓存是如何生成的
  7. Go运行环境搭建(Mac\Linux)
  8. 制作和unity调用动态链接库dll文件
  9. Mtk Android 打包解包*.img
  10. haproxy主配置文件
  11. java操作mysql的增删改查
  12. 字符串比较strcmp
  13. Python用Pillow(PIL)进行简单的图像操作
  14. Node的安装和进程管理
  15. Dynamics CRM项目实例之六:积分管理,汇总字段,计算字段,快速查看视图
  16. 好程序员分享居中一个float元素
  17. 简单的异步函数async/await例子
  18. hdu 6185 递推+【矩阵快速幂】
  19. localStorage单页面及不同页面监听变动
  20. Codeforces 623B Array GCD

热门文章

  1. [Fw]初探linux中断系统(1)
  2. 自增主键与UUID的优缺点
  3. Python的基本类型(list,tuple)
  4. java 调用DB2 SYSPROC.ADMIN_CMD存储过程导出数据
  5. 何时使用move
  6. xshell xftp使用
  7. Hdu-3333 Turning Tree (离线树状数组/线段树)
  8. 使用Maven创建Web项目(转)
  9. Robot Framework使用技巧之内部变量
  10. 转 HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth之完全详解