本次抓取猫眼电影Top100榜所用到的知识点:

1. python requests库

2. 正则表达式

3. csv模块

4. 多进程

正文

目标站点分析

通过对目标站点的分析, 来确定网页结构, 进一步确定具体的抓取方式.

1. 浏览器打开猫眼电影首页, 点击"榜单", 点击"Top100榜", 即可看到目标页面.

2. 浏览网页, 滚动到下方发现有分页, 切换到第2页, 发现: URL从 http://maoyan.com/board/4变换到http://maoyan.com/board/4?offset=10, 多次切换页码offset都有改变, 可以确定的是通过改变URL的offset参数来生成分页列表.

项目流程框架:

获取单页源码

1 #抓取猫眼电影TOP100榜

2 importrequests3 importtime4 from requests.exceptions importRequestException5 defget_one_page():6 '''获取单页源码'''

7 try:8 url = "http://maoyan.com/board/4?offset={0}".format(0)9 headers ={10 "User-Agent":"Mozilla/5.0(WindowsNT6.3;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/68.0.3440.106Safari/537.36"

11 }12 res = requests.get(url, headers=headers)13 #判断响应是否成功,若成功打印响应内容,否则返回None

14 if res.status_code == 200:15 print(res.text)16 returnNone17 exceptRequestException:18 returnNone19 defmain():20 get_one_page()21 if __name__ == '__main__':22 main()23 time.sleep(1)

执行即可得到网页源码, 那么下一步就是解析源码了

解析单页源码

导入正则表达式re模块, 对代码进行解析, 得到想要的信息.

1 importre2

3 defparse_one_page(html):4 '''解析单页源码'''

5 pattern = re.compile('

.*?board-index.*?>(\d+).*?name">(.*?).*?star">(.*?).*?releasetime'

6 + '.*?>(.*?)

.*?score.*?integer">(.*?).*?>(.*?).*?',re.S)7 items =re.findall(pattern,html)8 print(items)9 #采用遍历的方式提取信息

10 for item initems:11 yield{12 'rank':item[0],13 'title':item[1],14 'actor':item[2].strip()[3:] if len(item[2])>3 else '', #判断是否大于3个字符

15 'time' :item[3].strip()[5:] if len(item[3])>5 else '',16 'score':item[4] + item[5]17 }18 defmain():19 html =get_one_page()20 for item inparse_one_page(html):21 print(item)22

23 if __name__ == '__main__':24 main()25 time.sleep(1)

提取出信息之后, 那么下一步就是保存到文件

保存到文件中

这里采用两种方式, 一种是保存到text文件, 另一种是保存到csv文件中, 根据需要选择其一即可.

1. 保存到text文件

1 importjson2

3 defwrite_to_textfile(content):4 '''写入到text文件中'''

5 with open("MovieResult.text",'a',encoding='utf-8') as f:6 #利用json.dumps()方法将字典序列化,并将ensure_ascii参数设置为False,保证结果是中文而不是Unicode码.

7 f.write(json.dumps(content,ensure_ascii=False) + "\n")8 f.close()9 defmain():10 html =get_one_page()11 for item inparse_one_page(html):12 write_to_textfile(item)13

14 if __name__ == '__main__':15 main()16 time.sleep(1)

2. 保存到CSV文件

其文件以纯文本的形式存储表格数据

1 importcsv2 defwrite_to_csvfile(content):3 '''写入到csv文件中'''

4 with open("MovieResult.csv",'a',encoding='gb18030',newline='') as f:5 #将字段名传入列表

6 fieldnames = ["rank", "title", "actor", "time", "score"]7 #将字段名传给Dictwriter来初始化一个字典写入对象

8 writer = csv.DictWriter(f,fieldnames=fieldnames)9 #调用writeheader方法写入字段名

10 writer.writeheader()11 writer.writerows(content)12 f.close()13 defmain():14 html =get_one_page()15 rows =[]16 for item inparse_one_page(html):17 #write_to_textfile(item)

18 rows.append(item)19 write_to_csvfile(rows)20 if __name__ == '__main__':21 main()22 time.sleep(1)

单页的信息已经提取出, 接着就是提取多个页面的信息

获取多个页面

1. 普通方法抓取

1 defmain(offset):2 url = "http://maoyan.com/board/4?offset={0}".format(offset)3 html =get_one_page(url)4 rows =[]5 for item inparse_one_page(html):6 #write_to_textfile(item)

7 rows.append(item)8 write_to_csvfile(rows)9 if __name__ == '__main__':10 #通过遍历写入TOP100信息

11 for i in range(10):12 main(offset=i * 10)13 time.sleep(1)

2. 多进程抓取

1 from multiprocessing importPool2

3 if __name__ == '__main__':4 #将字段名传入列表

5 fieldnames = ["rank", "title", "actor", "time", "score"]6 write_to_csvField(fieldnames)7 pool =Pool()8 #map方法会把每个元素当做函数的参数,创建一个个进程,在进程池中运行.

9 pool.map(main,[i*10 for i in range(10)])

完整代码

1 #抓取猫眼电影TOP100榜

2 from multiprocessing importPool3 from requests.exceptions importRequestException4 importrequests5 importjson6 importtime7 importcsv8 importre9 defget_one_page(url):10 '''获取单页源码'''

11 try:12 headers ={13 "User-Agent":"Mozilla/5.0(WindowsNT6.3;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/68.0.3440.106Safari/537.36"

14 }15 res = requests.get(url, headers=headers)16 #判断响应是否成功,若成功打印响应内容,否则返回None

17 if res.status_code == 200:18 returnres.text19 returnNone20 exceptRequestException:21 returnNone22 defparse_one_page(html):23 '''解析单页源码'''

24 pattern = re.compile('

.*?board-index.*?>(\d+).*?name">(.*?).*?star">(.*?).*?releasetime'

25 + '.*?>(.*?)

.*?score.*?integer">(.*?).*?>(.*?).*?',re.S)26 items =re.findall(pattern,html)27 #采用遍历的方式提取信息

28 for item initems:29 yield{30 'rank':item[0],31 'title':item[1],32 'actor':item[2].strip()[3:] if len(item[2])>3 else '', #判断是否大于3个字符

33 'time' :item[3].strip()[5:] if len(item[3])>5 else '',34 'score':item[4] + item[5]35 }36

37 defwrite_to_textfile(content):38 '''写入text文件'''

39 with open("MovieResult.text",'a',encoding='utf-8') as f:40 #利用json.dumps()方法将字典序列化,并将ensure_ascii参数设置为False,保证结果是中文而不是Unicode码.

41 f.write(json.dumps(content,ensure_ascii=False) + "\n")42 f.close()43

44 defwrite_to_csvField(fieldnames):45 '''写入csv文件字段'''

46 with open("MovieResult.csv", 'a', encoding='gb18030', newline='') as f:47 #将字段名传给Dictwriter来初始化一个字典写入对象

48 writer = csv.DictWriter(f,fieldnames=fieldnames)49 #调用writeheader方法写入字段名

50 writer.writeheader()51 defwrite_to_csvRows(content,fieldnames):52 '''写入csv文件内容'''

53 with open("MovieResult.csv",'a',encoding='gb18030',newline='') as f:54 #将字段名传给Dictwriter来初始化一个字典写入对象

55 writer = csv.DictWriter(f,fieldnames=fieldnames)56 #调用writeheader方法写入字段名

57 #writer.writeheader() ###这里写入字段的话会造成在抓取多个时重复.

58 writer.writerows(content)59 f.close()60

61 defmain(offset):62 fieldnames = ["rank", "title", "actor", "time", "score"]63 url = "http://maoyan.com/board/4?offset={0}".format(offset)64 html =get_one_page(url)65 rows =[]66 for item inparse_one_page(html):67 #write_to_textfile(item)

68 rows.append(item)69 write_to_csvRows(rows,fieldnames)70

71 if __name__ == '__main__':72 #将字段名传入列表

73 fieldnames = ["rank", "title", "actor", "time", "score"]74 write_to_csvField(fieldnames)75 ##通过遍历写入TOP100信息

76 #for i in range(10):

77 #main(offset=i * 10,fieldnames=fieldnames)

78 #time.sleep(1)

79 pool =Pool()80 #map方法会把每个元素当做函数的参数,创建一个个进程,在进程池中运行.

81 pool.map(main,[i*10 for i in range(10)])

效果展示:

最终采用写入csv文件的方式.

python爬电影_Python爬虫项目--爬取猫眼电影Top100榜相关推荐

  1. 爬虫python下载电影_python爬虫:抓取下载电影文件,合并ts文件为完整视频

    目标网站:https://www.88ys.cc/vod-play-id-58547-src-1-num-1.html 反贪风暴4 对电影进行分析 我们发现,电影是按片段一点点加载出来的,我们分别抓取 ...

  2. python爬虫金融数据_python爬虫项目-爬取雪球网金融数据(关注、持续更新)

    (一)python金融数据爬虫项目 爬取目标:雪球网(起始url:https://xueqiu.com/hq#exchange=cn&firstname=1&secondname=1_ ...

  3. python编程理论篇_Python爬虫入门实战之猫眼电影数据抓取(理论篇)

    前言 本文可能篇幅较长,但是绝对干货满满,提供了大量的学习资源和途径.达到让读者独立自主的编写基础网络爬虫的目标,这也是本文的主旨,输出有价值能够真正帮助到读者的知识,即授人以鱼不如授人以渔,让我们直 ...

  4. python爬虫入门实战争胜法_Python爬虫入门实战之猫眼电影数据抓取(理论篇)

    前言 本文可能篇幅较长,但是绝对干货满满,提供了大量的学习资源和途径.达到让读者独立自主的编写基础网络爬虫的目标,这也是本文的主旨,输出有价值能够真正帮助到读者的知识,即授人以鱼不如授人以渔,让我们直 ...

  5. 爬虫之抓取猫眼电影排行

    一 需求 我们要提取出猫眼电影TOP100的电影名称.时间.评分.图片等信息,提取的站点URL为http://maoyan.com/board/4,提取的结果会以文件形式保存下来. 二 技术手段 利用 ...

  6. python接收弹幕_Python爬虫自动化爬取b站实时弹幕实例方法

    最近央视新闻记者王冰冰以清除可爱和专业的新闻业务水平深受众多网友喜爱,b站也有很多up主剪辑了关于王冰冰的视频.我们都是知道b站是一个弹幕网站,那你知道如何爬取b站实时弹幕吗?本文以王冰冰视频弹幕为例 ...

  7. Python爬虫笔记————抓取 猫眼电影排行榜Top100

    注:初学爬虫,本节仅使用requests库和使用正则作为解析工具 最近学习爬虫,找个比较简单的网页练习了一下,作为初入爬虫的小白,不足之处还请大家多多指教. 一.分析url 首先,打开目标站点http ...

  8. 详解用爬虫批量抓取猫眼电影票房数据

    "大数据"是一个体量特别大,数据类别特别大的数据集,并且这样的数据集无法用传统数据库工具对其内容进行抓取.管理和处理. "大数据"首先是指数据体量(volume ...

  9. python爬取链家新房_Python爬虫项目--爬取链家热门城市新房

    本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途) 环境 win8, python 3.7, pycharm 正文 1. 目标网站分析 通过分析, 找出相关url, 确 ...

最新文章

  1. 两对光纤收发器用网线连接_光纤那么快,路由器和电脑之间为何不用光纤连接,反而用普通网线...
  2. android--系统jar包引用
  3. Session,Cookie,jsessionid,Url重写
  4. Redis 6.0 新特性 ACL 介绍
  5. Codeforces Round #460 (Div. 2)
  6. 程序员必知的 20 个 Python 技巧!
  7. 经验:tensorflow 的 GPU 配置
  8. jsp无法提交nicEdit中的内容的解决办法
  9. Python根据身份证得知性别
  10. 2022电工(初级)操作证考试题库及模拟考试
  11. java后台通过http请求下载文件
  12. win7无法连接打印机拒绝访问_win7系统共享打印机拒绝访问的完美解决方法
  13. 图像处理的相关数学知识
  14. IMG2SMI: 将分子图像翻译成SMILES
  15. 自建服务器打印机,打印机服务器搭建 -cups
  16. cenos需要注意的小功能
  17. Visual Query Interfaces——文献翻译
  18. LeetCode(JavaScript实现)——回文数
  19. CV街景门牌号码识别02_数据读取与增广
  20. 淘宝购物车效果(加,减,删除,全选)

热门文章

  1. savour 钱包开发者招募
  2. 记录写博文用到的一些工具
  3. 计算机进位制转换方法,计算机进位数制及其转换方法和技巧
  4. S7-1200数据类型
  5. 湖南城市综合竞争力排名
  6. 惠普触控板使用指南_Windows10触控板的正确使用方法
  7. 23. 圆圈中最后剩下的数字
  8. ADB 使用详细教程——Awesome Adb
  9. 用友把工业互联网说透了
  10. Kronos木马都在不断进步,而你呢?