多种方法爬取猫眼电影Top100排行榜,保存到csv文件,下载封面图
参考链接:
https://blog.csdn.net/BF02jgtRS00XKtCx/article/details/83663400
https://www.makcyun.top/web_scraping_withpython1.html
因猫眼网站有些更新,参考链接中的部分代码执行报错,特修改一下
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- import csv
- import re
- from multiprocessing.pool import Pool
- import requests
- from bs4 import BeautifulSoup
- from lxml import etree
- from requests.exceptions import RequestException
- def get_one_page(url):
- try:
- headers = {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0'
- }
- response = requests.get(url, headers=headers)
- if response.status_code == 200:
- return response.text
- else:
- return None
- except RequestException:
- return None
- # 获取封面大图
- def get_thumb(url):
- # url = 'https://p0.meituan.net/movie/46c29a8b8d8424bdda7715e6fd779c66235684.jpg@160w_220h_1e_1c'
- pattern = re.compile(r'(.*?)@.*?')
- thumb = re.search(pattern, url)
- return thumb.group(1)
- # http://p0.meituan.net/movie/5420be40e3b755ffe04779b9b199e935256906.jpg@160w_220h_1e_1c
- # 去掉@160w_220h_1e_1c就是大图
- # 提取上映时间函数
- def get_release_time(data):
- pattern = re.compile(r'(.*?)(\(|$)')
- items = re.search(pattern, data)
- if items is None:
- return '未知'
- return items.group(1) # 返回匹配到的第一个括号(.*?)中结果即时间
- # 提取国家/地区函数
- def get_release_area(data):
- pattern = re.compile(r'.*\((.*)\)')
- # $表示匹配一行字符串的结尾,这里就是(.*?);(|$,表示匹配字符串含有(,或者只有(.*?)
- items = re.search(pattern, data)
- if items is None:
- return '未知'
- return items.group(1)
- # 使用正则表达式的写法
- 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) # re.S表示匹配任意字符,如果不加,则无法匹配换行符
- items = re.findall(pattern, html)
- for item in items:
- yield {
- 'index': item[0],
- 'thumb': get_thumb(item[1]), # 定义get_thumb()方法进一步处理网址
- 'name': item[2],
- 'star': item[3].strip()[3:],
- # 'time': item[4].strip()[5:],
- # 用一个方法分别提取time里的日期和地区
- 'time': get_release_time(item[4].strip()[5:]),
- 'area': get_release_area(item[4].strip()[5:]),
- 'score': item[5].strip() + item[6].strip()
- # 评分score由整数+小数两部分组成
- }
- # lxml结合xpath提取
- def parse_one_page2(html):
- parse = etree.HTML(html)
- items = parse.xpath('/html/body/div[4]//div//dd')
- for item in items:
- yield {
- 'index': item.xpath('./i/text()')[0],
- 'thumb': get_thumb(str(item.xpath('./a/img[2]/@data-src')[0].strip())),
- 'name': item.xpath('./div/div/div[1]/p[1]/a/@title')[0],
- 'star': item.xpath('.//p[@class="star"]/text()')[0].strip()[3:],
- 'realease_time': get_release_time(item.xpath('.//p[@class="releasetime"]/text()')[0].strip()[5:]),
- 'area': get_release_area(item.xpath('.//p[@class="releasetime"]/text()')[0].strip()[5:]),
- 'score': item.xpath('./div/div/div[2]/p/i[1]/text()')[0] + item.xpath('./div/div/div[2]/p/i[2]/text()')[0],
- }
- # 使用BeautifulSoup结合css选择器
- def parse_one_page3(html):
- soup = BeautifulSoup(html, 'lxml')
- items = range(10)
- for item in items:
- yield {
- 'index': soup.select('i.board-index')[item].string,
- 'thumb': get_thumb(soup.select('.board-img')[item]['data-src']),
- 'name': soup.select('.name a')[item].string,
- 'star': soup.select('.star')[item].string.strip()[3:],
- 'time': get_release_time(soup.select('.releasetime')[item].string.strip()[5:]),
- 'area': get_release_area(soup.select('.releasetime')[item].string.strip()[5:]),
- 'score': soup.select('.integer')[item].string + soup.select('.fraction')[item].string
- }
- # Beautiful Soup + find_all函数提取
- def parse_one_page4(html):
- soup = BeautifulSoup(html, 'lxml')
- items = range(10)
- for item in items:
- yield {
- 'index': soup.find_all(class_='board-index')[item].string,
- 'thumb': get_thumb(soup.find_all(class_='board-img')[item].attrs['data-src']),
- 'name': soup.find_all(name='p', attrs={'class': 'name'})[item].string,
- 'star': soup.find_all(name='p', attrs={'class': 'star'})[item].string.strip()[3:],
- 'time': get_release_time(soup.find_all(class_='releasetime')[item].string.strip()[5:]),
- 'area': get_release_area(soup.find_all(class_='releasetime')[item].string.strip()[5:]),
- 'score': soup.find_all(name='i', attrs={'class': 'integer'})[item].string +
- soup.find_all(name='i', attrs={'class': 'fraction'})[item].string
- }
- # 数据存储到csv
- def write_to_file3(item):
- with open('猫眼top100.csv', 'a', encoding='utf_8_sig', newline='') as f:
- # 'a'为追加模式(添加)
- # utf_8_sig格式导出csv不乱码
- fieldnames = ['index', 'thumb', 'name', 'star', 'time', 'area', 'score']
- w = csv.DictWriter(f, fieldnames=fieldnames)
- # w.writeheader()
- w.writerow(item)
- # 下载封面图片
- def download_thumb(name, url, num):
- try:
- response = requests.get(url)
- with open('封面图/' + name + '.jpg', 'wb') as f:
- f.write(response.content)
- print('第%s部电影封面下载完毕' % num)
- print('------')
- except RequestException as e:
- print(e)
- pass
- # 不能是w,否则会报错,因为图片是二进制数据所以要用wb
- def main(offset):
- url = 'http://maoyan.com/board/4?offset=' + str(offset)
- html = get_one_page(url)
- for item in parse_one_page4(html):
- write_to_file3(item)
- download_thumb(item['name'], item['thumb'], item['index'])
- if __name__ == '__main__':
- pool = Pool()
- pool.map(main, [i * 10 for i in range(10)])
多种方法爬取猫眼电影Top100排行榜,保存到csv文件,下载封面图的更多相关文章
- 多线程爬取猫眼电影TOP100并保存到mongo数据库中
import requests import re import json from requests.exceptions import RequestException from multipro ...
- python爬虫入门新手向实战 - 爬取猫眼电影Top100排行榜
本次主要爬取Top100电影榜单的电影名.主演和上映时间, 同时保存为excel表个形式, 其他相似榜单也都可以依葫芦画瓢 首先打开要爬取的网址https://maoyan.com/board/4, ...
- 50 行代码教你爬取猫眼电影 TOP100 榜所有信息
对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天,恋习Python的手把手系列,手把手教你入门Python爬虫,爬取猫眼电影TOP100榜信息,将涉及到基础爬虫 ...
- 40行代码爬取猫眼电影TOP100榜所有信息
主要内容: 一.基础爬虫框架的三大模块 二.完整代码解析及效果展示 1️⃣ 基础爬虫框架的三大模块 1.HTML下载器:利用requests模块下载HTML网页. 2.HTML解析器:利用re正则表 ...
- 用requests库爬取猫眼电影Top100
这里需要注意一下,在爬取猫眼电影Top100时,网站设置了反爬虫机制,因此需要在requests库的get方法中添加headers,伪装成浏览器进行爬取 import requests from re ...
- PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)
利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...
- # [爬虫Demo] pyquery+csv爬取猫眼电影top100
目录 [爬虫Demo] pyquery+csv爬取猫眼电影top100 站点分析 代码君 [爬虫Demo] pyquery+csv爬取猫眼电影top100 站点分析 https://maoyan.co ...
- 爬虫系列(1)-----python爬取猫眼电影top100榜
对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天在整理代码时,整理了一下之前自己学习爬虫的一些代码,今天先上一个简单的例子,手把手教你入门Python爬虫,爬取 ...
- python 爬取猫眼电影top100数据
最近有爬虫相关的需求,所以上B站找了个视频(链接在文末)看了一下,做了一个小程序出来,大体上没有修改,只是在最后的存储上,由txt换成了excel. 简要需求:爬虫爬取 猫眼电影TOP100榜单 数据 ...
随机推荐
- joinColumns和inverseJoinColumns的使用方法
近期在工作中使用springside.里面用到了hibernate的多对多 一開始我在配置department(部门表)和menu(栏目表)的时候.这样写的. Department实体类中的getMe ...
- 多工程联编的Pods如何设置
多工程联编的Pods如何设置 (2014-07-17 13:57:10) 转载▼ 标签: 联编 多工程 分类: iOS开发 如今,CocoaPods使用越来越多,几乎每个项目都会使用到.有时候我们的项 ...
- HDU 2110-Crisis of HDU(母函数)
Crisis of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- 移动互联网App推广的十大难题
常常有朋友来问."我做了一个App,请问怎么推广啊?"或者就是"我们公司开发了一个App.想短时间内获取巨大的量."还有的就是问"有没有什么好渠道三个 ...
- 我在Suse 11 Sp3上使用anaconda安装TensorFlow的过程记录
我在Suse 11 Sp3上使用anaconda安装TensorFlow的过程记录 准备安装包: gcc48 glibc--SP4-DVD-x86_64-GM-DVD1.iso tensorflow_ ...
- poj--1753--Flip Game(dfs好题)
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37201 Accepted: 16201 Descr ...
- 自适应阈值分割—大津法(OTSU算法)C++实现
大津法是一种图像灰度自适应的阈值分割算法,是1979年由日本学者大津提出,并由他的名字命名的.大津法按照图像上灰度值的分布,将图像分成背景和前景两部分看待,前景就是我们要按照阈值分割出来的部分.背景和 ...
- UIDynamicBehavior的简单使用:接球小游戏
一.概念扩充: 1.在开发中,我们可以使用UIKit中提供的仿真行为,实现与现实生活中类似的物理仿真动画,UIKit动力学最大的特点是将现实世界动力驱动的动画引入了UIKit,比如重力,铰链连接,碰撞 ...
- (Go)08.time示例
package main import ( "fmt" "time" ) func test() { ) } func main() { now := time ...
- python 46 边界圆角 、a_img_list标签 、伪类选择器
一:边界圆角 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...