参考链接:

https://blog.csdn.net/BF02jgtRS00XKtCx/article/details/83663400

https://www.makcyun.top/web_scraping_withpython1.html

因猫眼网站有些更新,参考链接中的部分代码执行报错,特修改一下

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import csv
  5. import re
  6. from multiprocessing.pool import Pool
  7.  
  8. import requests
  9. from bs4 import BeautifulSoup
  10. from lxml import etree
  11. from requests.exceptions import RequestException
  12.  
  13. def get_one_page(url):
  14. try:
  15. headers = {
  16. 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0'
  17. }
  18. response = requests.get(url, headers=headers)
  19. if response.status_code == 200:
  20. return response.text
  21. else:
  22. return None
  23. except RequestException:
  24. return None
  25.  
  26. # 获取封面大图
  27. def get_thumb(url):
  28. # url = 'https://p0.meituan.net/movie/46c29a8b8d8424bdda7715e6fd779c66235684.jpg@160w_220h_1e_1c'
  29. pattern = re.compile(r'(.*?)@.*?')
  30. thumb = re.search(pattern, url)
  31. return thumb.group(1)
  32. # http://p0.meituan.net/movie/5420be40e3b755ffe04779b9b199e935256906.jpg@160w_220h_1e_1c
  33. # 去掉@160w_220h_1e_1c就是大图
  34.  
  35. # 提取上映时间函数
  36. def get_release_time(data):
  37. pattern = re.compile(r'(.*?)(\(|$)')
  38. items = re.search(pattern, data)
  39. if items is None:
  40. return '未知'
  41. return items.group(1) # 返回匹配到的第一个括号(.*?)中结果即时间
  42.  
  43. # 提取国家/地区函数
  44. def get_release_area(data):
  45. pattern = re.compile(r'.*\((.*)\)')
  46. # $表示匹配一行字符串的结尾,这里就是(.*?);(|$,表示匹配字符串含有(,或者只有(.*?)
  47. items = re.search(pattern, data)
  48. if items is None:
  49. return '未知'
  50. return items.group(1)
  51.  
  52. # 使用正则表达式的写法
  53. def parse_one_page(html):
  54. pattern = re.compile(
  55. '<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>',
  56. re.S) # re.S表示匹配任意字符,如果不加,则无法匹配换行符
  57. items = re.findall(pattern, html)
  58. for item in items:
  59. yield {
  60. 'index': item[0],
  61. 'thumb': get_thumb(item[1]), # 定义get_thumb()方法进一步处理网址
  62. 'name': item[2],
  63. 'star': item[3].strip()[3:],
  64. # 'time': item[4].strip()[5:],
  65. # 用一个方法分别提取time里的日期和地区
  66. 'time': get_release_time(item[4].strip()[5:]),
  67. 'area': get_release_area(item[4].strip()[5:]),
  68. 'score': item[5].strip() + item[6].strip()
  69. # 评分score由整数+小数两部分组成
  70. }
  71.  
  72. # lxml结合xpath提取
  73. def parse_one_page2(html):
  74. parse = etree.HTML(html)
  75. items = parse.xpath('/html/body/div[4]//div//dd')
  76. for item in items:
  77. yield {
  78. 'index': item.xpath('./i/text()')[0],
  79. 'thumb': get_thumb(str(item.xpath('./a/img[2]/@data-src')[0].strip())),
  80. 'name': item.xpath('./div/div/div[1]/p[1]/a/@title')[0],
  81. 'star': item.xpath('.//p[@class="star"]/text()')[0].strip()[3:],
  82. 'realease_time': get_release_time(item.xpath('.//p[@class="releasetime"]/text()')[0].strip()[5:]),
  83. 'area': get_release_area(item.xpath('.//p[@class="releasetime"]/text()')[0].strip()[5:]),
  84. 'score': item.xpath('./div/div/div[2]/p/i[1]/text()')[0] + item.xpath('./div/div/div[2]/p/i[2]/text()')[0],
  85. }
  86.  
  87. # 使用BeautifulSoup结合css选择器
  88. def parse_one_page3(html):
  89. soup = BeautifulSoup(html, 'lxml')
  90. items = range(10)
  91. for item in items:
  92. yield {
  93. 'index': soup.select('i.board-index')[item].string,
  94. 'thumb': get_thumb(soup.select('.board-img')[item]['data-src']),
  95. 'name': soup.select('.name a')[item].string,
  96. 'star': soup.select('.star')[item].string.strip()[3:],
  97. 'time': get_release_time(soup.select('.releasetime')[item].string.strip()[5:]),
  98. 'area': get_release_area(soup.select('.releasetime')[item].string.strip()[5:]),
  99. 'score': soup.select('.integer')[item].string + soup.select('.fraction')[item].string
  100. }
  101.  
  102. # Beautiful Soup + find_all函数提取
  103. def parse_one_page4(html):
  104. soup = BeautifulSoup(html, 'lxml')
  105. items = range(10)
  106. for item in items:
  107. yield {
  108. 'index': soup.find_all(class_='board-index')[item].string,
  109. 'thumb': get_thumb(soup.find_all(class_='board-img')[item].attrs['data-src']),
  110. 'name': soup.find_all(name='p', attrs={'class': 'name'})[item].string,
  111. 'star': soup.find_all(name='p', attrs={'class': 'star'})[item].string.strip()[3:],
  112. 'time': get_release_time(soup.find_all(class_='releasetime')[item].string.strip()[5:]),
  113. 'area': get_release_area(soup.find_all(class_='releasetime')[item].string.strip()[5:]),
  114. 'score': soup.find_all(name='i', attrs={'class': 'integer'})[item].string +
  115. soup.find_all(name='i', attrs={'class': 'fraction'})[item].string
  116. }
  117.  
  118. # 数据存储到csv
  119. def write_to_file3(item):
  120. with open('猫眼top100.csv', 'a', encoding='utf_8_sig', newline='') as f:
  121. # 'a'为追加模式(添加)
  122. # utf_8_sig格式导出csv不乱码
  123. fieldnames = ['index', 'thumb', 'name', 'star', 'time', 'area', 'score']
  124. w = csv.DictWriter(f, fieldnames=fieldnames)
  125. # w.writeheader()
  126. w.writerow(item)
  127.  
  128. # 下载封面图片
  129. def download_thumb(name, url, num):
  130. try:
  131. response = requests.get(url)
  132. with open('封面图/' + name + '.jpg', 'wb') as f:
  133. f.write(response.content)
  134. print('第%s部电影封面下载完毕' % num)
  135. print('------')
  136. except RequestException as e:
  137. print(e)
  138. pass
  139. # 不能是w,否则会报错,因为图片是二进制数据所以要用wb
  140.  
  141. def main(offset):
  142. url = 'http://maoyan.com/board/4?offset=' + str(offset)
  143. html = get_one_page(url)
  144. for item in parse_one_page4(html):
  145. write_to_file3(item)
  146. download_thumb(item['name'], item['thumb'], item['index'])
  147.  
  148. if __name__ == '__main__':
  149. pool = Pool()
  150. pool.map(main, [i * 10 for i in range(10)])

多种方法爬取猫眼电影Top100排行榜,保存到csv文件,下载封面图的更多相关文章

  1. 多线程爬取猫眼电影TOP100并保存到mongo数据库中

    import requests import re import json from requests.exceptions import RequestException from multipro ...

  2. python爬虫入门新手向实战 - 爬取猫眼电影Top100排行榜

    本次主要爬取Top100电影榜单的电影名.主演和上映时间, 同时保存为excel表个形式, 其他相似榜单也都可以依葫芦画瓢 首先打开要爬取的网址https://maoyan.com/board/4, ...

  3. 50 行代码教你爬取猫眼电影 TOP100 榜所有信息

    对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天,恋习Python的手把手系列,手把手教你入门Python爬虫,爬取猫眼电影TOP100榜信息,将涉及到基础爬虫 ...

  4. 40行代码爬取猫眼电影TOP100榜所有信息

    主要内容: 一.基础爬虫框架的三大模块 二.完整代码解析及效果展示 1️⃣  基础爬虫框架的三大模块 1.HTML下载器:利用requests模块下载HTML网页. 2.HTML解析器:利用re正则表 ...

  5. 用requests库爬取猫眼电影Top100

    这里需要注意一下,在爬取猫眼电影Top100时,网站设置了反爬虫机制,因此需要在requests库的get方法中添加headers,伪装成浏览器进行爬取 import requests from re ...

  6. PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)

    利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...

  7. # [爬虫Demo] pyquery+csv爬取猫眼电影top100

    目录 [爬虫Demo] pyquery+csv爬取猫眼电影top100 站点分析 代码君 [爬虫Demo] pyquery+csv爬取猫眼电影top100 站点分析 https://maoyan.co ...

  8. 爬虫系列(1)-----python爬取猫眼电影top100榜

    对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天在整理代码时,整理了一下之前自己学习爬虫的一些代码,今天先上一个简单的例子,手把手教你入门Python爬虫,爬取 ...

  9. python 爬取猫眼电影top100数据

    最近有爬虫相关的需求,所以上B站找了个视频(链接在文末)看了一下,做了一个小程序出来,大体上没有修改,只是在最后的存储上,由txt换成了excel. 简要需求:爬虫爬取 猫眼电影TOP100榜单 数据 ...

随机推荐

  1. joinColumns和inverseJoinColumns的使用方法

    近期在工作中使用springside.里面用到了hibernate的多对多 一開始我在配置department(部门表)和menu(栏目表)的时候.这样写的. Department实体类中的getMe ...

  2. 多工程联编的Pods如何设置

    多工程联编的Pods如何设置 (2014-07-17 13:57:10) 转载▼ 标签: 联编 多工程 分类: iOS开发 如今,CocoaPods使用越来越多,几乎每个项目都会使用到.有时候我们的项 ...

  3. HDU 2110-Crisis of HDU(母函数)

    Crisis of HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  4. 移动互联网App推广的十大难题

    常常有朋友来问."我做了一个App,请问怎么推广啊?"或者就是"我们公司开发了一个App.想短时间内获取巨大的量."还有的就是问"有没有什么好渠道三个 ...

  5. 我在Suse 11 Sp3上使用anaconda安装TensorFlow的过程记录

    我在Suse 11 Sp3上使用anaconda安装TensorFlow的过程记录 准备安装包: gcc48 glibc--SP4-DVD-x86_64-GM-DVD1.iso tensorflow_ ...

  6. poj--1753--Flip Game(dfs好题)

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37201   Accepted: 16201 Descr ...

  7. 自适应阈值分割—大津法(OTSU算法)C++实现

    大津法是一种图像灰度自适应的阈值分割算法,是1979年由日本学者大津提出,并由他的名字命名的.大津法按照图像上灰度值的分布,将图像分成背景和前景两部分看待,前景就是我们要按照阈值分割出来的部分.背景和 ...

  8. UIDynamicBehavior的简单使用:接球小游戏

    一.概念扩充: 1.在开发中,我们可以使用UIKit中提供的仿真行为,实现与现实生活中类似的物理仿真动画,UIKit动力学最大的特点是将现实世界动力驱动的动画引入了UIKit,比如重力,铰链连接,碰撞 ...

  9. (Go)08.time示例

    package main import ( "fmt" "time" ) func test() { ) } func main() { now := time ...

  10. python 46 边界圆角 、a_img_list标签 、伪类选择器

    一:边界圆角 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...