在进行本节实战之前,希望您对requests库以及正则表达式有所了解。


运行平台:windows
**Python版本: Python3.x **

一、依赖库的安装

在本节实战之前,请确保已经正确安装了requests库
requests库的安装

pip3 install requests

如果您使用的是conda环境,可以选择使用以下安装方法

conda install requests

###二、抓取分析
猫眼电影TOP100的目标站点为http://maoyan.com/board/4?offset=0

将网页滚动到最下方,点击第二页。
当网页跳转后,发现页面的URL发生如下变化

每一页显示的电影排名数目为10,而offset便代表着偏移量。
根据我们的推测,点击第三页后,网页URL中offset的值便会变成20,检验后没有问题。
因此,我们想获得TOP100的电影信息,只需要分开请求10次,而这10次的offset参数分别设置为0,10,20…90即可。这样获取不同的页面之后,利用正则表达式提取相关信息,即可爬取电影排行榜电影信息。

###三、实战进行中
首先,我们引入我们需要的库文件

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

爬取首页

def get_one_page(url):try:headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'}response = requests.get(url,headers=headers)if response.status_code == 200:return response.textreturn 0except RequestExceptrion:return 0

添加headers报头进行爬虫伪装,利用requests.get函数发起请求
如果网页返回码为200(成功),则return response.text,返回页面源代码

我们来输出一下网页的源代码看以下

print(get_one_page('http://maoyan.com/board/4?offset=0'))

运行后,如下图所示

说明我们爬取成功,接下来我们只需要从网页源代码里匹配我们需要的信息即可。

正则提取
【前提:了解贪婪匹配/非贪婪匹配】
利用开发者模式下的Network监听组件可以查看网页的真实源代码

我们可以看到,一部电影对应的源代码便是一个dd节点,我们利用正则表达式来提取里面的电影信息。
正则表达式写法不唯一,只要能够提取到信息即可,在这里我主要使用的是.*?匹配方法。
举个例子:

<dd>.*?board-index.*?>(.*?)</i>

()里的信息便是我们匹配的信息,在这里我们匹配了排名,同样的,电影名称、演员表等信息的匹配与之相同。
最后,正则表达式如下(不唯一,自己写比较方便):

<dd>.*?board-index.*?>(.*?)</i>.*?title="(.*?)".*?img data-src="(.*?)".*?<p class="star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i><i class="fraction">(\d+).*?</dd>

在这里我们匹配了电影排名,电影名称,电影封面图,演员表,上映时间,评分。
compile()
在进行后续操作前,先简单讲解一下compile()方法,这个方法可以将正则字符串编译成正则表达式对象,以便在后续的匹配中复用。
因此,我们使用compile()方法编译对象:

    pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?title="(.*?)".*?img data-src="(.*?)".*?<p class="star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i><i class="fraction">(\d+).*?</dd>',re.S)

re.S是修饰符:使.匹配包括换行符在内的所有字符
因此解析页面的函数实现如下:

def parse_one_page(html):pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?title="(.*?)".*?img data-src="(.*?)".*?<p class="star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i><i class="fraction">(\d+).*?</dd>',re.S)items = re.findall(pattern,html)print(items)

此时,我们将代码合并,便是如下

import requests
import re
import json
import time
from requests.exceptions import RequestExceptiondef get_one_page(url):try:headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'}response = requests.get(url,headers=headers)if response.status_code == 200:return response.textreturn 0except RequestExceptrion:return 0def parse_one_page(html):pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?title="(.*?)".*?img data-src="(.*?)".*?<p class="star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i><i class="fraction">(\d+).*?</dd>',re.S)items = re.findall(pattern,html)print(items)html = get_one_page('http://maoyan.com/board/4?offset=0')
parse_one_page(html)

运行结果如下


可以看到,我们已经成功爬取了本页内电影的信息,但是数据比较杂乱,因此我们需要将匹配结果处理以下,遍历提取结果并生成字典。
此时parse_one_page函数改下如下:

def parse_one_page(html):pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?title="(.*?)".*?img data-src="(.*?)".*?<p class="star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i><i class="fraction">(\d+).*?</dd>',re.S)items = re.findall(pattern,html)for item in items:yield{'index':item[0],'title':item[1],'image':item[2],'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(),}

输入以下代码运行

html = get_one_page('http://maoyan.com/board/4?offset=0')
for item in parse_one_page(html):print(item)


这样每个电影的信息便会成为一个个字典,形成结构化数据。

写入文件
写入文件我们分为txt写入和csv文件写入。
首先我们来讲txt文件写入。
txt
通过JSON库的dumps()方法实现字典的序列化,并指定ensure_ascii参数为FALSE,这样可以保证输出结果是中文形式而不是Unicode编码

def write_to_file(content):with open('maoyanSpider.txt','a',encoding='utf-8')as f:f.write(json.dumps(content,ensure_ascii=False)+'\n')

csv
写入csv文件的话,我们还需要引入csv库。

import csv
def write_to_file(content):with open('maoyanSpider.csv','a+',newline='')as csvfile:writer = csv.writer(csvfile)values = list(content.values())writer.writerow(values)

使用content.values()方法读取json数据,然后转换成列表。
接着使用writerow()将values数据一次一行的写入csv中
在open中newline=’ '是为了防止写入数据后多出空白行。

分页爬取
这也是爬虫的最后一步了,我们之前的操作都是爬取一个页面,而我们需要抓取的TOP100中含有10个页面,所以还需要遍历一下。

def spider(offset):url = 'http://maoyan.com/board/4?offset='+str(offset)html = get_one_page(url)for item in parse_one_page(html):write_to_file(item)if __name__=='__main__':for i in range(10):spider(offset=10*i)time.sleep(1)

四、完整代码

爬取猫眼电影排行榜并存放于txt

import requests
import re
import json
import time
from requests.exceptions import RequestExceptiondef get_one_page(url):try:headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'}response = requests.get(url,headers=headers)if response.status_code == 200:return response.textreturn 0except RequestExceptrion:return 0def spider(offset):url = 'http://maoyan.com/board/4?offset='+str(offset)html = get_one_page(url)for item in parse_one_page(html):print(item)write_to_file(item)def parse_one_page(html):pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?title="(.*?)".*?img data-src="(.*?)".*?<p class="star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i><i class="fraction">(\d+).*?</dd>',re.S)items = re.findall(pattern,html)for item in items:yield{'index':item[0],'title':item[1],'image':item[2],'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(),}def write_to_file(content):with open('maoyanSpider.txt','a',encoding='utf-8')as f:f.write(json.dumps(content,ensure_ascii=False)+'\n')if __name__=='__main__':for i in range(10):spider(offset=10*i)time.sleep(1)

爬取猫眼电影排行榜并存放于csv

import requests
import re
import json
import time
from requests.exceptions import RequestException
import csvdef get_one_page(url):try:headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'}response = requests.get(url,headers=headers)if response.status_code == 200:return response.textreturn 0except RequestExceptrion:return 0def spider(offset):url = 'http://maoyan.com/board/4?offset='+str(offset)html = get_one_page(url)for item in parse_one_page(html):write_to_file(item)def parse_one_page(html):pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?title="(.*?)".*?img data-src="(.*?)".*?<p class="star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i><i class="fraction">(\d+).*?</dd>',re.S)items = re.findall(pattern,html)for item in items:yield{'index':item[0],'title':item[1],'image':item[2],'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(),}def write_to_file(content):with open('maoyanSpider.csv','a+',newline='')as csvfile:writer = csv.writer(csvfile)values = list(content.values())writer.writerow(values)if __name__=='__main__':for i in range(10):spider(offset=10*i)time.sleep(1)

【Python爬虫】爬取猫眼电影排行榜并存放至csv文件相关推荐

  1. python爬虫爬取豆瓣电影排行榜并通过pandas保存到Excel文件当中

    我们的需求是利用python爬虫爬取豆瓣电影排行榜数据,并将数据通过pandas保存到Excel文件当中(步骤详细) 我们用到的第三方库如下所示: import requests import pan ...

  2. 【python教程入门学习】Python爬虫抓取猫眼电影排行榜

    本节使用 Python 爬虫抓取猫眼电影网 TOP100 排行榜(https://maoyan.com/board/4)影片信息,包括电影名称.上映时间.主演信息. 在开始编写程序之前,首先要确定页面 ...

  3. python爬虫爬取豆瓣电影排行榜,并写进csv文件,可视化数据分析

    #1.爬取内容,写进csv文件 import requests import re import csv #豆瓣电影排行榜,写进csv文件 url = "https://movie.doub ...

  4. Python爬虫爬取猫眼电影风语咒影评评论信息

    风语咒作为扛起国漫崛起的又一国漫之作,爬取风语咒猫眼的电影评论数据,以便对其评论做之后的数据分析. 此次demo的流程图如下: 一.找到猫眼电影中风语咒影评得json数据: l 找出url后,往下滚动 ...

  5. python爬虫 爬取猫眼电影数据

    # 定义一个函数获取猫眼电影的数据​ import requestsdef main():url = url = 'http://maoyan.com/board/4?offset=0'html = ...

  6. python爬虫--爬取-猫眼电影-代码

    import re import requests class Mao():def __call__(self, *args, **kwargs):"""当前类的对象当做 ...

  7. 爬虫(2)-解析库xpath和beautifulsoup爬取猫眼电影排行榜前100部电影

    解析库爬取猫眼电影前100部电影 认为有用的话请点赞,码字不易,谢谢. 其他爬虫实战请查看:https://blog.csdn.net/qq_42754919/category_10354544.ht ...

  8. 爬虫(1)-正则化表达式爬取猫眼电影排行榜前100部电影

    爬取猫眼电影排行榜前100部电影 文章目录 爬取猫眼电影排行榜前100部电影 1.抓取首页 2.正则化表达式提取信息 3.保存到文件中 4.抓取前100部电影 认为有用的话请点赞,码字不易,谢谢. 其 ...

  9. 2019-01-18-Python爬取猫眼电影排行榜

    title: Python爬取猫眼电影排行榜 date: 2019-01-18 20:44:16 tags: python lxml requests json categories: python ...

最新文章

  1. springMVC--(讲解3)数据处理
  2. linux 文件系统检查命令
  3. 交叉编译并移植opencv3.0.0到arm板
  4. 刚到的新公司 前任经理匆匆见了一面 飞鸽传书下载
  5. MySQL8.0与MySQL5.7 OLTP 性能测试对比
  6. java反射 获取变量值_Java反射:如何获取变量的名称?
  7. perl语言编程 第四版_被称作“胶水语言”的PERL,在芯片设计和验证中可以这样使用...
  8. nacos 服务日志_如何屏蔽Nacos日志输出?
  9. np-hard证明实例 规约
  10. c/c++中与字符串处理相关的函数
  11. 双容水箱液位串级控制系统的设计
  12. 利用Aria2和Pandown实现科学下载百度云资源
  13. flash debug版本
  14. 加密文件夹密码忘记怎么办?
  15. 360云盘服务器停止怎么找回,360云盘宣布关闭,老司机们的“珍藏”何去何从?...
  16. Oralce ERP中AP模块Vender银行信息查询语句
  17. CSS3 设置模糊背景图片
  18. Pony.ai 自动驾驶
  19. 思途旅游电商系统源码介绍
  20. yapi自动化接口操作

热门文章

  1. 如何计算CPU的DMIPS
  2. 计算机用户无法加载配置文件,““用户配置文件服务登录失败。无法加载用户配置文件””的解决方案...
  3. 树莓派自定义显示分辨率
  4. 目标检测的Tricks | 【Trick8】数据增强——随机旋转、平移、缩放、错切、hsv增强
  5. 12.1 剪贴板的简单用法
  6. 程序员必须知道的字符集与字符编码详解
  7. Linux Hdparm对硬盘操作
  8. PostGIS空间索引
  9. 01 微服务和微服务框架 —— SpringCloud
  10. OpenHarmony-Hi3518EV300挂载烧写