zoukankan      html  css  js  c++  java
  • Python3编写网络爬虫04-爬取猫眼电影排行实例

    利用requests库和正则表达式 抓取猫眼电影TOP100 (requests比urllib使用更方便,由于没有学习HTML系统解析库 选用re)

    1.目标 抓取电影名称 时间 评分 图片等

    url http://maoyan.com/board/4 结果以文件形式保存

    2.分析

    offset 代表偏移量 如果为n 电影序号为n+1~n+10 每页显示10个

    获取100 分开请求10次 offset 分别为0 10 20...90 利用正则提取相关信息

    3.抓取页面

    import requests
    #爬取第一页 页面信息
    def get_one_page(url):
    header = {
    "User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
    }
    response = requests.get(url,headers=header)
    if response.status_code == 200:#判断是否请求成功
    return response.text
    return None

    # 定义一个main函数 调用get_one_page 发送请求 打印结果

    def main():
    url = 'http://maoyan.com/board/4'
    html = get_one_page(url)#调用请求函数
    print(html)
    main()

    分析页面
    电影信息对应节点为<dd>
    提取排名 class 为 board-index i节点内 正则 <dd>.*?board-index.*?>(.*?)</i>
    电影图片 查看为第二个img链接 <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)"
    电影名字 p节点 class 为name <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>
    主演 <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>
    发布时间 <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>
    评分 <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>

    定义分析页面的方法 parse_one_page()

    import requests
    import re
    def get_one_page(url):
    header = {
    "User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
    }
    response = requests.get(url,headers=header)
    if response.status_code == 200:
    return response.text
    return None
    
    def parse_one_page(html):
    pattern = re.compile(
    '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S
    )
    items = re.findall(pattern,html)
    print(items)
    # 定义一个main函数 调用get_one_page 发送请求 打印结果
    def main():
    url = 'http://maoyan.com/board/4'
    html = get_one_page(url)
    # print(html)
    parse_one_page(html)
    main()

    将匹配结果遍历 生成字典

    import requests
    import re
    
    
    def get_one_page(url):
    header = {
    "User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
    }
    response = requests.get(url,headers=header)
    if response.status_code == 200:
    return response.text
    return None
    
    def parse_one_page(html):# html为网页源码
    pattern = re.compile(
    '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</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].strip(),
    'actor': item[3].strip()[3:] if len(item[3]) > 3 else'',
    'time': item[4].strip()[5:] if len(item[4]) > 5 else '',
    'score': item[5].strip()+item[6].strip()
    }
    #返回一个生成器 yield
    
    # 定义一个main函数 调用get_one_page 发送请求 打印结果
    def main():
    url = 'http://maoyan.com/board/4'
    html = get_one_page(url)
    # print(html)
    for item in parse_one_page(html):#遍历生成器
    print(item)
    main()
    
    写入文件
    
    将提取结果 写入文件 通过json库 的dumps() 实现字典的序列化 指定ensure_ascii 参数为 False 
    #写入文件
    def write_to_file(content):
    with open('result.txt','a',encoding='utf-8') as f:
    print(type(json.dumps(content)))
    f.write(json.dumps(content,ensure_ascii=False)+'
    ')

    整合代码 单页面电影提取

    import requests
    import re
    import json
    # 请求页面
    def get_one_page(url):
    header = {
    "User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
    }
    response = requests.get(url,headers=header)
    if response.status_code == 200:
    return response.text
    return None
    
    #解析页面
    def parse_one_page(html):# html为网页源码
    pattern = re.compile(
    '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</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].strip(),
    'actor': item[3].strip()[3:] if len(item[3]) > 3 else'',
    'time': item[4].strip()[5:] if len(item[4]) > 5 else '',
    'score': item[5].strip()+item[6].strip()
    }
    #返回一个生成器 yield
    
    #写入文件
    def write_to_file(content):
    with open('result.txt','a',encoding='utf-8') as f:
    print(type(json.dumps(content)))
    f.write(json.dumps(content,ensure_ascii=False)+'
    ')
    
    
    # 定义一个main函数 调用get_one_page 发送请求 打印结果
    def main():
    url = 'http://maoyan.com/board/4'
    html = get_one_page(url)
    # print(html)
    for item in parse_one_page(html):#遍历生成器
    write_to_file(item)
    main()

    分页爬取

    # 定义一个main函数 调用get_one_page 发送请求 打印结果

    def main(offset):
    url = 'http://maoyan.com/board/4?offset=' + str(offset)
    html = get_one_page(url)
    # print(html)
    for item in parse_one_page(html):#遍历生成器
    write_to_file(item)
    
    if __name__ == '__main__':
    for i in range(10):
    main(offset = i *10)

    整理代码

    #-*-coding:utf-8-*-
    
    import requests #请求库
    import re #正则模块
    import json #json模块
    import time #时间模块
    from requests.exceptions import RequestException#捕获异常模块
    # 请求页面
    def get_one_page(url):
    #异常处理
    try:
    header = {
    "User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
    }
    response = requests.get(url,headers=header)
    # 判断状态码是否为200
    if response.status_code == 200:
    return response.text
    return None
    except RequestException:
    return None
    
    #解析页面
    def parse_one_page(html):# html为网页源码
    #定义爬取规则
    pattern = re.compile(
    '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</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].strip(),
    'actor': item[3].strip()[3:] if len(item[3]) > 3 else'',
    'time': item[4].strip()[5:] if len(item[4]) > 5 else '',
    'score': item[5].strip()+item[6].strip()
    }
    #返回一个生成器 yield
    
    #写入文件
    def write_to_file(content):
    with open('result.txt','a',encoding='utf-8') as f:
    # print(type(json.dumps(content)))
    # ensure_ascii=False 保证输出结果为中文
    f.write(json.dumps(content,ensure_ascii=False)+'
    ')
    
    
    # 定义一个main函数 调用get_one_page 发送请求 参数offset 网页偏移量
    def main(offset):
    #拼接url地址
    url = 'http://maoyan.com/board/4?offset=' + str(offset)
    # 请求函数
    html = get_one_page(url)
    # print(html)
    # 解析函数 和 文件保存函数
    for item in parse_one_page(html):#遍历生成器
    write_to_file(item)
    
    if __name__ == '__main__':
    for i in range(10):
    main(offset = i *10)
    #延时处理
    time.sleep(3)

    # 最基础的实例 做好总结

  • 相关阅读:
    JAVA 多线程(3)
    JAVA 多线程(2)
    JAVA 多线程(1):synchronized
    阿里金服设置公钥-验证私钥
    linux (1): 启动
    新建项目虚拟环境及pycharm配置
    python创建udp服务端和客户端
    python创建tcp服务端和客户端
    python并发(阻塞、非阻塞、epoll)
    mongo基本操作
  • 原文地址:https://www.cnblogs.com/liuxiaosong/p/10281432.html
Copyright © 2011-2022 走看看