精华内容
下载资源
问答
  • 然后获取的信息保存文本文件。 2.网页分析 要爬取的网页为猫眼电影TOP100(http://maoyan.com/board/4),网页页面如下所示: 看一下页面的显示规律是怎样的,一页是显示10部电影名称。第二页的...

    1.概述

    使用Requests库和正则表达式爬取猫眼电影TOP100中的电影信息,包括电影名称、主演、上映时间、评分、图片等信息。然后将获取的信息保存到文本文件。

    2.网页分析

    要爬取的网页为猫眼电影TOP100 http://maoyan.com/board/4
    网页页面如下所示:
    猫眼TOP100
    看一下页面的显示规律是怎样的,一页是显示10部电影名称。第二页的url和内容如下所示:url为:http://maoyan.com/board/4?offset=10
    可以看出和第一页的url的主要差别为后面的offset,要抓取后面的网页的内容,只要在url后面加上相应的offset参数就可以了。
    第二页

    3.请求网页

    首先请求一个页面,通过requests中的get方法,请求网页。

    # 获取单个页面
    def get_one_page(url):
        try:
            # 添加头部信息
            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'
            }
            response = requests.get(url, headers=headers)
            # 进行状态码判断,是否正确读取到网页
            if response.status_code == 200:
                return response.text
            return None
        except RequestException:
            return None
    

    测试是否成功获取到网页的页面信息。

    def main():
        url = 'http://maoyan.com/board/4'
        html = get_one_page(url)
        print(html)
    

    3.正则表达式

    获取到网页的信息之后,就需要用正则表达式来解析网页,抓取我们所需要的信息;打开浏览器的审查元素功能,查看网页的源码,查找我们需要抓取的信息在哪个位置。
    TOP100源码
    以第一个电影为例:分析源码。可以看到我们所需要的信息都包含在下面的html代码中。

        <dd>
        <i class="board-index board-index-1">1</i>
        <a href="/films/1203" title="霸王别姬" class="image-link" data-act="boarditem-click" data-val="{movieId:1203}">
        <img src="//ms0.meituan.net/mywww/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
        <img data-src="http://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c" alt="霸王别姬" class="board-img" />
        </a>
        <div class="board-item-main">
          <div class="board-item-content">
                  <div class="movie-item-info">
            <p class="name"><a href="/films/1203" title="霸王别姬" data-act="boarditem-click" data-val="{movieId:1203}">霸王别姬</a></p>
            <p class="star">
                    主演:张国荣,张丰毅,巩俐
            </p>
    <p class="releasetime">上映时间:1993-01-01(中国香港)</p>    </div>
        <div class="movie-item-number score-num">
    <p class="score"><i class="integer">9.</i><i class="fraction">6</i></p>        
        </div>
    
          </div>
        </div>
    
      </dd>
    

    一个电影的信息都包含在<dd>标签中,我们需要从中抓取图片、名称、主演、上映时间、评分等信息。通过正则表达式来实现:

    # 解析网页
    def parse_one_page(html):
        pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?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],
                'actor': item[3].strip()[3:],
                'time': item[4].strip()[5:],
                'score': item[5] + item[6]
            }
    
    '<dd>.*?board-index.*?>(\d+)</i>.*?src="(.*?)".*?name"><a'
    +'.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
    +'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>'
    

    这串字符串就是我们用到的正则表达式,先从<dd>标签开始进行匹配,首先匹配的board-index,表示是电影的排名信息,用非贪婪匹配来提取i节点中的信息;接下来匹配图片的链接信息,保存在src标签中,然后通过name属性匹配电影的名称,再去p标签中查找star属性,得到主演的信息,后面接着获取releasetime发行时间和评分的信息。

    4.保存

    正则表达式写好之后,可以先测试输出一下,看得到的是否是我们想要的信息,如果信息无误就把信息用文本保存下来。
    这里通过JSON库的dumps()方法实现字典的序列化,并指定ensure_ascii参数为False,这样可以保证输出结果是中文形式而不是Unicode编码。

    # 将抓取的内容保存到文件
    def write_to_file(content):
        with open('result.txt', 'a', encoding='utf-8') as f:
            f.write(json.dumps(content, ensure_ascii=False) + '\n')
            f.close()
    

    完整代码

    完整的python代码如下,后面使用Pool进程池,多进程来提升代码的抓取效率。

    import requests
    from requests.exceptions import RequestException
    import re
    import json
    from multiprocessing import Pool
    
    # 获取单个页面
    def get_one_page(url):
        try:
            # 添加头部信息
            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'
            }
            response = requests.get(url, headers=headers)
            # 进行状态码判断,是否正确读取到网页
            if response.status_code == 200:
                return response.text
            return None
        except RequestException:
            return None
    
    # 解析网页
    def parse_one_page(html):
        pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?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],
                'actor': item[3].strip()[3:],
                'time': item[4].strip()[5:],
                'score': item[5] + item[6]
            }
    
    # 将抓取的内容保存到文件
    def write_to_file(content):
        with open('result.txt', 'a', encoding='utf-8') as f:
            f.write(json.dumps(content, ensure_ascii=False) + '\n')
            f.close()
    
    def main(offset):
        url = 'http://maoyan.com/board/4?offset=' + str(offset)
        html = get_one_page(url)
        # print(html)
        # parse_one_page(html)
        for item in parse_one_page(html):
            print(item)
            write_to_file(item)
    
    if __name__ == '__main__':
        pool = Pool()
        pool.map(main, [i*10 for i in range(10)])
        # for i in range(10):
          # main(i*10)
    
    

    最终运行结果如下:
    运行结果

    展开全文
  • DTD文件也是一个ASCII的文本文件,后缀名.dtd。例如:myfile.dtd。 什么要用DTD文件呢?我的理解是它满足了网络共享和数据交互,使用DTD最大的好处在于DTD文件的共享。(就是上文DTD说明语句中的PUBLIC属性)。...
  • C#开发经验技巧宝典

    2008-10-14 20:19:21
    0704 如何将文本文件转换成网页文件 434 0705 如何产生随机文件夹名或文件名 435 0706 如何长文件名转换成短文件名 436 0707 如何用程序创建XML文档并写入内容 436 0708 如何通过DataSet对象读取XML文件...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0249 删除文本文件中的多余空格 165 0250 创建和使用资源文件 166 第8章 窗体与界面设计 169 8.1 窗体标题栏控制 170 0251 如何实现标题栏闪烁的窗体 170 0252 如何实现不可移动的窗体 170 0253 如何在...
  • 0249 删除文本文件中的多余空格 165 0250 创建和使用资源文件 166 第8章 窗体与界面设计 169 8.1 窗体标题栏控制 170 0251 如何实现标题栏闪烁的窗体 170 0252 如何实现不可移动的窗体 170 0253 如何在...
  • 0249 删除文本文件中的多余空格 165 0250 创建和使用资源文件 166 第8章 窗体与界面设计 169 8.1 窗体标题栏控制 170 0251 如何实现标题栏闪烁的窗体 170 0252 如何实现不可移动的窗体 170 0253 如何在...
  • 0249 删除文本文件中的多余空格 165 0250 创建和使用资源文件 166 第8章 窗体与界面设计 169 8.1 窗体标题栏控制 170 0251 如何实现标题栏闪烁的窗体 170 0252 如何实现不可移动的窗体 170 0253 如何在...
  • 0249 删除文本文件中的多余空格 165 0250 创建和使用资源文件 166 第8章 窗体与界面设计 169 8.1 窗体标题栏控制 170 0251 如何实现标题栏闪烁的窗体 170 0252 如何实现不可移动的窗体 170 0253 如何在...
  • 0249 删除文本文件中的多余空格 165 0250 创建和使用资源文件 166 第8章 窗体与界面设计 169 8.1 窗体标题栏控制 170 0251 如何实现标题栏闪烁的窗体 170 0252 如何实现不可移动的窗体 170 0253 如何在...
  • 实例287 数据库内容导出为文本文件 377 8.9 数据库其他操作 379 实例288 系统错误记录 379 实例289 如何图片从数据库中提取出来 380 实例290 原生ADO应用技术 381 实例291 标准记录编辑界面 383 ...
  • word使用技巧大全

    热门讨论 2011-03-18 20:37:53
    59、过滤网页内容 91 60、快速转换大写金额 92 61、去掉自动编号功能 92 62、去除绘图时出现的画布 92 63、巧用“格式刷” 92 64、部分加粗表格线 92 65、隐藏累赘的文字 92 66、长文档前后比照有妙招 92 67、让标尺...
  • 实例145 文字保存为图片 186 3.10 图像应用 187 实例146 随机更换壁纸程序 187 实例147 屏幕保护 189 实例148 模拟石英钟 191 实例149 生肖速查 193 第4章 多媒体技术 195 4.1 cd、vcd播放 ...
  • 实例145 文字保存为图片 186 3.10 图像应用 187 实例146 随机更换壁纸程序 187 实例147 屏幕保护 189 实例148 模拟石英钟 191 实例149 生肖速查 193 第4章 多媒体技术 195 4.1 cd、vcd播放 ...
  • 低级文件I/O介绍了读写二进制和文本文件的方法及相关函数。之后以专题形式,全面讲解了读写文本文件的技巧与方法。 第3章:二维绘图简介。本章主要介绍了与GUI设计密切相关的线性二维绘图及其相关函数、绘图工具函数...
  • C#编程经验技巧宝典

    热门讨论 2008-06-01 08:59:33
    55 <br>0076 约瑟夫环问题 56 <br>0077 猴子选大王 57 <br>0078 如何判断IP是否正确 57 <br>0079 如何小写金额转换大写金额 57 <br>0080 统计文本字数 58 <br>0081 文本中首字母改...
  • 12.5.2 文本文件 140 12.5.3 二进制数据 140 12.5.4 内存映射文件 140 12.5.5 文件格式 140 12.5.6 分隔符 142 12.6 文件支持的网络框架 143 12.6.1 动机 143 12.6.2 实现 145 12.7 反馈 145 第13章 卧库表...
  • C#.net_经典编程例子400个

    热门讨论 2013-05-17 09:25:30
    267 6.5 复制文件 268 实例186 移动正在使用的文件 268 实例187 批量复制文件 269 6.6 指定类型的文件操作 270 实例188 文本文件的操作 270 实例189 简单的文件加密解密 271 6.7 ...
  • 实例148 文字保存为图片 215 4.10 图像应用 215 实例149 随机更换壁纸程序 216 实例150 屏幕保护 217 实例151 模拟石英钟 219 实例152 生肖速查 221 第5章 多媒体技术 225 5.1 CD、VCD播放 226 实例...
  • 实例170 文字保存为图片 240 实例171 捕获屏幕 241 4.10 图像应用 243 实例172 随机更换壁纸程序 243 实例173 屏幕保护 244 实例174 模拟石英钟 247 实例175 生肖速查 249 第5章 多媒体技术 251 5.1 CD、VCD播放 ...
  • 程序开发范例宝典>>

    2012-10-24 10:41:28
    实例170 文字保存为图片 240 实例171 捕获屏幕 241 4.10 图像应用 243 实例172 随机更换壁纸程序 243 实例173 屏幕保护 244 实例174 模拟石英钟 247 实例175 生肖速查 249 第5章 多媒体技术 ...
  • C#程序开发范例宝典(第2版).part02

    热门讨论 2012-11-12 07:55:11
    实例170 文字保存为图片 240 实例171 捕获屏幕 241 4.10 图像应用 243 实例172 随机更换壁纸程序 243 实例173 屏幕保护 244 实例174 模拟石英钟 247 实例175 生肖速查 249 第5章 多媒体技术 251 5.1 CD、...
  • C#程序开发范例宝典(第2版).part13

    热门讨论 2012-11-12 20:17:14
    实例170 文字保存为图片 240 实例171 捕获屏幕 241 4.10 图像应用 243 实例172 随机更换壁纸程序 243 实例173 屏幕保护 244 实例174 模拟石英钟 247 实例175 生肖速查 249 第5章 多媒体技术 251 5.1 CD、...
  • 实例170 文字保存为图片 240 实例171 捕获屏幕 241 4.10 图像应用 243 实例172 随机更换壁纸程序 243 实例173 屏幕保护 244 实例174 模拟石英钟 247 实例175 生肖速查 249 第5章 多媒体技术 251 5.1 CD、...
  • 实例170 文字保存为图片 240 实例171 捕获屏幕 241 4.10 图像应用 243 实例172 随机更换壁纸程序 243 实例173 屏幕保护 244 实例174 模拟石英钟 247 实例175 生肖速查 249 第5章 多媒体技术 251 5.1 CD、...
  • 实例170 文字保存为图片 240 实例171 捕获屏幕 241 4.10 图像应用 243 实例172 随机更换壁纸程序 243 实例173 屏幕保护 244 实例174 模拟石英钟 247 实例175 生肖速查 249 第5章 多媒体技术 251 5.1 CD、...
  • 实例170 文字保存为图片 240 实例171 捕获屏幕 241 4.10 图像应用 243 实例172 随机更换壁纸程序 243 实例173 屏幕保护 244 实例174 模拟石英钟 247 实例175 生肖速查 249 第5章 多媒体技术 251 5.1 CD、...
  • 实例170 文字保存为图片 240 实例171 捕获屏幕 241 4.10 图像应用 243 实例172 随机更换壁纸程序 243 实例173 屏幕保护 244 实例174 模拟石英钟 247 实例175 生肖速查 249 第5章 多媒体技术 251 5.1 CD、...
  • 实例170 文字保存为图片 240 实例171 捕获屏幕 241 4.10 图像应用 243 实例172 随机更换壁纸程序 243 实例173 屏幕保护 244 实例174 模拟石英钟 247 实例175 生肖速查 249 第5章 多媒体技术 251 5.1 CD、...

空空如也

空空如也

1 2 3
收藏数 55
精华内容 22
关键字:

怎样将网页内容保存为文本文件