zoukankan      html  css  js  c++  java
  • 14-Requests+正则表达式爬取猫眼电影

    '''Requests+正则表达式爬取猫眼电影TOP100'''
    '''
    流程框架:
    抓去单页内容:利用requests请求目标站点,得到单个网页HTML代码,返回结果。
    正则表达式分析:根据HTML代码分析得到电影的名称、主演、上映时间、评分、图片链接等信息。
    保存至文件:通过文件的形式保存结果,每一部电影一个结果一行Json字符串。
    开启循环及多线程:对多页内容遍历,开启多线程提高抓取速度。
    '''
    import requests
    import re
    from requests.exceptions import RequestException
    import json
    from multiprocessing import Pool

    def get_one_page(url,headers):
    '''得到网页源码'''
    try:
    #此处必须要传入headers参数,否则因为有些网站服务器的反爬机制,会返回403 Forbidden。参考:https://blog.csdn.net/lv0817/article/details/79185322
    response = requests.get(url=url,headers=headers) #这里要注意,必须使用url=url,headers=headers的格式,否则传参无效。
    if response.status_code == 200:
    return response.text
    return None
    #可以查看requests库的官方文档的Exceptions模块,可知RequestException为所有异常的父类或间接父类。
    except RequestException:
    return None

    def parse_one_page(html):
    '''解析得到的网页源码'''
    #编译正则表达式
    pattern = re.compile('<dd>.*?board-index.*?>(d+)</i>.*?data-src="(.*?)".*?name"><a.*?>(.*?)</a>.*?star">(.*?)</p>'
    '.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>',re.S)
    items = re.findall(pattern,html)
    #创建一个生成器
    for item in items:
    yield {
    'index':item[0],
    'image':item[1],
    'title':item[2],
    'actor':item[3].strip()[3:],
    'time':item[4][5:],
    'score':item[5]+item[6]
    }

    def write_to_file(content):
    '''解析好的数据写入到文件'''
    with open('result.txt','a',encoding='utf-8') as f: #'a'表示内容可追加。当有中文时,指定编码utf-8防止乱码。
    #json.dumps序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii = False。
    f.write(json.dumps(content,ensure_ascii=False) + ' ') #json.dumps将字典转换为字符串
    f.close()

    def main(offset):
    url = "http://maoyan.com/board/4?offset=" + str(offset) #点击下一页观察网址可知
    headers = {
    'User-Agent': 'Mozilla/5.0(Macintosh;Intel Mac OS X 10_11_4)AppleWebKit/537.36(KHTML,like Gecko)Chrome/52.0.2743.116 Safari/537.36'
    }
    html = get_one_page(url,headers)
    #遍历生成器
    for item in parse_one_page(html):
    print(item)
    write_to_file(item)

    if __name__ == '__main__':
    # for i in range(10):
    # main(i*10)
    #如果要实现秒抓的话,就要使用多进程。
    #进程池提供指定数量的进程供用户调用,如果有新的请求提交到进程池,池子还没有满,它就会创建新的进程来执行请求,如果池子满了就先等待。
    #构造进程池
    pool = Pool() #声明一个进程池
    pool.map(main,[i*10 for i in range(10)]) #第一个参数是方法名,第二个参数是可遍历对象。map方法作用是,拿出可遍历数组中的每一个值当做函数的参数,然后创建一个个的进程,放到进程池里面去运行。





  • 相关阅读:
    Azure产品目录
    AWS产品目录
    BD
    Cloud Resource
    do-release-upgrade升级笔记
    Gluster vs Ceph:开源存储领域的正面较量
    OpenStack大规模部署详解
    SECURITY ONION:防御领域的kali
    vue非父子组件间传参问题
    vue源码之响应式数据
  • 原文地址:https://www.cnblogs.com/wisir/p/10035702.html
Copyright © 2011-2022 走看看