【python】爬取豆瓣电影Top250(附源码)

前言

        在网络爬虫的开发过程中,经常会遇到需要处理一些反爬机制的情况。其中之一就是网站对于频繁访问的限制,即IP封禁。为了绕过这种限制,我们可以使用代理IP来动态改变请求的来源IP地址。在本篇博客中,将介绍如何使用代理IP的技术来爬取某瓣电影排行榜,并将结果写入Excel文件。

准备工作

首先,我们需要准备以下环境和工具:

  • Python编程语言

  • requests库:用于发送HTTP请求

  • BeautifulSoup库:用于解析HTML页面

  • openpyxl库:用于操作Excel文件

  • 一个可用的代理IP池

步骤

1. 获取代理IP

        使用搜索引擎搜索"免费代理IP",找到一个可用的代理IP网站。请注意,不同的网站可能有不同的获取代理IP的方式。你需要根据特定网站的规则来获取代理IP列表。

使用IP代理的必要性:

  1. 隐藏真实的访问源,保护个人或机构的隐私和安全。

  2. 绕过目标网站的访问限制,如IP封禁、地区限制等。

  3. 分散访问压力,提高爬取效率和稳定性。

  4. 收集不同地区或代理服务器上的数据,用于数据分析和对比。

爬虫是一种通过自动化方式从网站上获取数据的程序,而代理IP则是用于隐藏真实IP地址的中间服务器。

        IP代理和爬虫的关系?

        当你使用爬虫程序时,你的请求会发送到目标网站,并且网站可以看到你的真实IP地址。然而,如果你频繁地发送请求,可能会导致你的IP地址被封锁或限制访问。为了解决这个问题,可以使用代理IP。

        代理IP充当了一个中间服务器的角色,将你的请求通过不同的IP地址发送到目标网站。这样,目标网站只能看到代理IP的地址,而不是你的真实IP地址。通过使用不同的代理IP轮换发送请求,可以减少被封锁或限制访问的风险。

        另外,代理IP还可以用于绕过地理限制。有些网站或服务可能根据用户所在地区提供不同的内容或限制访问。通过使用代理IP,你可以模拟不同地区的访问,以便获取特定地区的数据。

2. 验证代理IP的可用性

        将获取的代理IP列表保存到一个文件中(例如proxies.txt),然后编写代码来验证这些代理IP是否可用。我们可以通过发送请求到一个公开的IP查询API,来检查代理IP是否有效。

import requests
​
def check_proxy(proxy):try:response = requests.get("http://ip-api.com/json", proxies={"http": proxy, "https": proxy}, timeout=5)if response.status_code == 200:return Trueexcept requests.exceptions.RequestException:passreturn False
​
with open("proxies.txt", "r") as f:proxies = f.read().splitlines()
​
valid_proxies = []
for proxy in proxies:if check_proxy(proxy):valid_proxies.append(proxy)
​
print(valid_proxies)

3. 爬取某瓣电影排行榜

        使用valid_proxies中的代理IP,编写代码来发送HTTP请求并解析网页内容。我们可以使用BeautifulSoup库来解析HTML页面,并提取所需的信息。

        导入模块:

        代码导入了所需要的库,包括re用于正则表达式操作,pandas用于写入Excel文件,requests用于发送HTTP请求,lxml用于解析HTML网页内容,time用于延时操作。

import re # 正则
import pandas as pd # pandas,写入Excel文件
import requests
from lxml import etree
import time 

        定义函数get_html_str(url),该函数用于发送HTTP请求并获取响应内容。函数中设置了请求头模拟浏览器,并可以添加代理IP进行请求。最后返回网页源码。

        

def get_html_str(url):# 请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}proxies = {"http": "自己填一下子",}# 添加请求头和代理IP发送请求response = requests.get(url, headers=headers, proxies=proxies)  ## 获取网页源码html_str = response.content.decode()# 返回网页源码return html_str

        定义函数get_data(html_str, data_list),该函数用于从网页源码中提取数据并存入列表。函数使用lxml将网页源码转换为Elements对象方便后续使用XPath进行解析。通过XPath取到所有的li标签,然后遍历每个li标签,利用XPath获取每个字段的信息,例如排名、电影名、评分等,并使用正则表达式进行字符串的提取和处理,最后将数据存入列表。

def get_data(html_str, data_list):"""提取数据写入列表"""# 将html字符串转换为etree对象方便后面使用xpath进行解析html_data = etree.HTML(html_str)# 利用xpath取到所有的li标签li_list = html_data.xpath("//ol[@class='grid_view']/li")# 打印一下li标签个数看是否和一页的电影个数对得上print(len(li_list))  # 输出25,没有问题# 遍历li_list列表取到某一个电影的对象for li in li_list:# 用xpath获取每一个字段信息# 排名ranking = li.xpath(".//div[@class='pic']/em/text()")[0]# 电影名title = li.xpath(".//div[@class='hd']/a/span[1]/text()")[0]# 评分score = li.xpath(".//span[@class='rating_num']/text()")[0]# 评价人数evaluators_number = li.xpath(".//div[@class='star']/span[4]/text()")[0]evaluators_number = evaluators_number.replace('人评价', '')  # 将'人评价'替换为替换为空,更美观# 导演、主演str1 = li.xpath(".//div[@class='bd']/p[1]//text()")[0]# 利用正则提取导演名try:director = re.findall("导演: (.*?)主演", str1)[0]director = re.sub('\xa0', '', director)except:director = None# 利用正则提取主演try:performer = re.findall("主演: (.*)", str1)[0]performer = re.sub('\xa0', '', performer)except:performer = None# 上映时间、制片国家、电影类型都在这里标签下str2 = li.xpath(".//div[@class='bd']/p[1]//text()")[1]#try:# 通过斜杠进行分割str2_list = str2.split(' / ')# 年份year = re.sub('[\n ]', '', str2_list[0])# 制片国家country = str2_list[1]# 影片类型type = re.sub('[\n ]', '', str2_list[2])except:year = Nonecountry = Nonetype = Noneurl = li.xpath(".//div[@class='hd']/a/@href")[0]print({'排名': ranking, '电影名': title, '评分': score, '评价人数': evaluators_number, '导演': director,'主演': performer, '年份': year, '制片国家': country, '影片类型': type, '影片主页链接': url})data_list.append({'排名': ranking, '电影名': title, '评分': score, '评价人数': evaluators_number, '导演': director,'主演': performer, '年份': year, '制片国家': country, '影片类型': type, '影片主页链接': url})

        定义函数into_excel(data_list),该函数用于将数据列表写入Excel文件。首先创建一个DataFrame对象,然后使用to_excel()方法将DataFrame写入Excel文件。

       

def into_excel(data_list):# 创建DataFrame对象df = pd.DataFrame(data_list)# 写入excel文件df.to_excel('电影Top250排行.xlsx')

        定义了一个主函数main(),该函数用于控制流程。在主函数中,设置了翻页,循环遍历10页的数据。通过拼接URL,调用get_html_str()函数获取网页源码,然后调用get_data()函数提取数据,并将数据存入列表。为了控制爬取速度,使用time.sleep()方法进行延时操作。最后调用into_excel()函数将数据列表写入Excel文件。

        


def main():data_list = []  # 空列表用于存储每页获取到的数据# 1. 设置翻页for i in range(10):url = 'https://movie.douban.com/top250?start=' + str(i * 25) + '&filter='# 2. 获取网页源码html_str = get_html_str(url)# 3. 提取数据get_data(html_str, data_list)# 4. 限制爬取的速度time.sleep(5)# 5. 写入excelinto_excel(data_list)if __name__ == "__main__":main()

最终效果图

         完整代码如下:

        

import re # 正则
import pandas as pd # pandas,写入Excel文件
import requests
from lxml import etree
import time def get_html_str(url):# 请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}proxies = {"http": "自己填一下子",}# 添加请求头和代理IP发送请求response = requests.get(url, headers=headers, proxies=proxies)  ## 获取网页源码html_str = response.content.decode()# 返回网页源码return html_strdef get_data(html_str, data_list):"""提取数据写入列表"""# 将html字符串转换为etree对象方便后面使用xpath进行解析html_data = etree.HTML(html_str)# 利用xpath取到所有的li标签li_list = html_data.xpath("//ol[@class='grid_view']/li")# 打印一下li标签个数看是否和一页的电影个数对得上print(len(li_list))  # 输出25,没有问题# 遍历li_list列表取到某一个电影的对象for li in li_list:# 用xpath获取每一个字段信息# 排名ranking = li.xpath(".//div[@class='pic']/em/text()")[0]# 电影名title = li.xpath(".//div[@class='hd']/a/span[1]/text()")[0]# 评分score = li.xpath(".//span[@class='rating_num']/text()")[0]# 评价人数evaluators_number = li.xpath(".//div[@class='star']/span[4]/text()")[0]evaluators_number = evaluators_number.replace('人评价', '')  # 将'人评价'替换为替换为空,更美观# 导演、主演str1 = li.xpath(".//div[@class='bd']/p[1]//text()")[0]# 利用正则提取导演名try:director = re.findall("导演: (.*?)主演", str1)[0]director = re.sub('\xa0', '', director)except:director = None# 利用正则提取主演try:performer = re.findall("主演: (.*)", str1)[0]performer = re.sub('\xa0', '', performer)except:performer = None# 上映时间、制片国家、电影类型都在这里标签下str2 = li.xpath(".//div[@class='bd']/p[1]//text()")[1]#try:# 通过斜杠进行分割str2_list = str2.split(' / ')# 年份year = re.sub('[\n ]', '', str2_list[0])# 制片国家country = str2_list[1]# 影片类型type = re.sub('[\n ]', '', str2_list[2])except:year = Nonecountry = Nonetype = Noneurl = li.xpath(".//div[@class='hd']/a/@href")[0]print({'排名': ranking, '电影名': title, '评分': score, '评价人数': evaluators_number, '导演': director,'主演': performer, '年份': year, '制片国家': country, '影片类型': type, '影片主页链接': url})data_list.append({'排名': ranking, '电影名': title, '评分': score, '评价人数': evaluators_number, '导演': director,'主演': performer, '年份': year, '制片国家': country, '影片类型': type, '影片主页链接': url})def into_excel(data_list):# 创建DataFrame对象df = pd.DataFrame(data_list)# 写入excel文件df.to_excel('电影Top250排行.xlsx')def main():data_list = []  # 空列表用于存储每页获取到的数据# 1. 设置翻页for i in range(10):url = 'https://movie.douban.com/top250?start=' + str(i * 25) + '&filter='# 2. 获取网页源码html_str = get_html_str(url)# 3. 提取数据get_data(html_str, data_list)# 4. 限制爬取的速度time.sleep(5)# 5. 写入excelinto_excel(data_list)if __name__ == "__main__":main()

总结

        通过使用代理IP技术,我们可以绕过网站的IP封禁限制,成功爬取某瓣电影排行榜的信息,并将结果写入Excel文件。这样,我们就可以方便地对电影信息进行整理和分析了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/34434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebRTC | 实现数据流的一对一通信

目录 一、浏览器对WebRTC的支持 二、MediaStream与MediaStreamTrack 三、RTCPeerConnection 1. RTCPeerConnection与本地音视频数据绑定 2. 媒体协商SDP 3. ICE (1)Candidate信息 (2)WebRTC收集Candidate (3&…

搭建Docker环境

目录 一、docker环境搭建 1、卸载旧版本docker 2、安装依赖和设置仓库 3、安装docker 4、启动并加入开机启动 5、验证是否安装成功 二、利用docker搭建nginx 1、拉取镜像 2、启动容器,部署nginx 一、docker环境搭建 1、卸载旧版本docker yum remove docke…

【linux】2 软件管理器yum和编辑器vim

目录 1. linux软件包管理器yum 1.1 什么是软件包 1.2 关于rzsz 1.3 注意事项 1.4 查看软件包 1.5 如何安装、卸载软件 1.6 centos 7设置成国内yum源 2. linux开发工具-Linux编辑器-vim使用 2.1 vim的基本概念 2.2 vim的基本操作 2.3 vim正常模式命令集 2.4 vim末行…

[Blender]Geometry nodes altermesh to UE

首先要先下载插件 AlterMesh – Use geometry nodes inside Unreal 下载对应版本的插件后 打开UE,在对应的设置里面挂上blender.exe的路径 去官方下载一个Blender Geometry nodes 的示例 Demo Files — blender.org​​​​​​

Java项目-苍穹外卖-Day03

文章目录 员工分页查询功能实现需求分析和设计代码开发pageHelper底层代码完善 启用禁用员工账号功能开发需求分析 员工分页查询功能实现 需求分析和设计 代码开发 先设计类 将对应分页查询的传参类以及结果类进行封装 对应真正返回的为Result<PageResult>Controller…

电商3D产品渲染简明教程

3D 渲染让动作电影看起来更酷&#xff0c;让建筑设计变得栩栩如生&#xff0c;现在还可以帮助营销人员推广他们的产品。 从最新的《阿凡达》电影到 Spotify 的上一次营销活动&#xff0c;3D 的应用让一切变得更加美好。 在营销领域&#xff0c;3D 产品渲染可帮助品牌创建产品的…

Scratch 之 枪战的枪械画法

大家可以参考百度图片寻找到的AK-47图片&#xff1a;AK47图片 此处我以MK18作为参照&#xff0c;MK18的造型可以在资源中获取 资源链接&#xff1a;https://download.csdn.net/download/leyang0910/88136393 对于不必要的&#xff08;繁琐的&#xff09;线条&#xff0c;我们可…

分享kubernetes部署:基于Ansible自动安装kubernetes

基于Ansible自动安装kubernetes 环境准备 我们以如下机器环境为例&#xff1a; 开放端口&#xff1a; 控制平面节点 工作节点 请按如上中规定的开放端口&#xff0c;或关闭防火墙&#xff1a; systemctlstopfirewalld&&\ systemctldisablefirewalld 安装常用工具 sudo…

点亮你的第一颗Led灯

1、&#x1f4d5;前言 该系列文章用于记录个人学习stm32单片机的过程&#xff0c;全文搭配图文解说&#xff0c;零基础的萌新也能读懂&#xff0c;欢迎指导讨论~ 2、&#x1f4e6;准备材料 2.1、&#x1f4dd;硬件材料清单 面包板1块 PWLINK PowerWriter仿真器1个 杜…

Python web实战之Django 的缓存机制详解

关键词&#xff1a;Python、Web 开发、Django、缓存 1. 缓存是什么&#xff1f;为什么需要缓存&#xff1f; 在 Web 开发中&#xff0c;缓存是一种用于存储数据的临时存储区域。它可以提高应用程序的性能和响应速度&#xff0c;减轻服务器的负载。 当用户访问网页时&#xff…

STM32基于CubeIDE和HAL库 基础入门学习笔记:功能驱动与应用

文章目录&#xff1a; 一&#xff1a;LED与按键驱动程序 main.c 1.闪灯 led.h led.c 2.按键控制LED亮灭 key.h key.c 二&#xff1a;蜂鸣器与继电器驱动程序 main.c 1.蜂鸣器 buzzer.h buzzer.c delay.h delay.c 2.继电器 relay.h relay.c 三&#xff1…

Spring Boot 统一功能处理(拦截器实现用户登录权限的统一校验、统一异常返回、统一数据格式返回)

目录 1. 用户登录权限校验 1.1 最初用户登录权限效验 1.2 Spring AOP 用户统⼀登录验证 1.3 Spring 拦截器 &#xff08;1&#xff09;创建自定义拦截器 &#xff08;2&#xff09;将自定义拦截器添加到系统配置中&#xff0c;并设置拦截的规则 1.4 练习&#xff1a;登录…

腾讯云2核2g轻量应用服务器能容纳多少人?

腾讯云轻量应用服务器2核2g能容纳多少人&#xff1f;轻量应用服务器2核2g配置自带4M公网带宽&#xff0c;以网站应用为例&#xff0c;假设优化后的网页平均大小为60KB&#xff0c;2核2G4M带宽轻量服务器可以支持10个并发数&#xff0c;即同时10个人在1秒内同时打开网站&#xf…

【C++学习系列】1.小谷记账踩坑记

文章目录 前言1.基础支持2. 几个小坑2.1 为什么要用引用传值2.2 头文件的作用2.3 while true的使用和跳出 3. 未解决的问题 前言 是尚硅谷的C第一季的项目&#xff0c;我跟着敲下来了&#xff0c;发现几个坑点&#xff0c;记录下来&#xff1b; 1.基础支持 有这个则只require…

大华智慧园区综合管理平台文件上传漏洞复现(HW0day)

0x01 产品简介 “大华智慧园区综合管理平台”是一款综合管理平台&#xff0c;具备园区运营、资源调配和智能服务等功能。平台意在协助优化园区资源分配&#xff0c;满足多元化的管理需求&#xff0c;同时通过提供智能服务&#xff0c;增强使用体验。 0x02 漏洞概述 大华智慧园…

Vue+SpringBoot项目开发:登录页面美化,登录功能实现(三)

写在开始:一个搬砖程序员的随缘记录上一章写了从零开始VueSpringBoot后台管理系统&#xff1a;Vue3TypeScript项目搭建 VueTypeScript的前端项目已经搭建完成了 这一章的内容是引入element-plus和axios实现页面的布局和前后端数据的串联&#xff0c;实现一个登陆的功能&#x…

「何」到底该读「なん」还是「なに」?柯桥学日语

「何」到底该读「なん」还是「なに」&#xff1f; 首先&#xff0c;讲一个规律&#xff0c;大家记住就行。当「何」后面所接单词的第一个发音在“た”、“だ”、“な”行时&#xff0c;读作“なん”。一般这种情况下&#xff0c;后面跟的是の、でも、です和だ。 用例&#xff…

php后端实现调用高德地图进行POI搜索

对于当前位置或者选定省市位置进行查询 接口实现 /*** 查询地址* ApiTitle (查询地址)* ApiSummary (查询地址)* ApiMethod (POST)* ApiRoute (/api/demo/address)* ApiParams (name"dart", type"integer", requiredtrue, description"省…

【软件工程】数据流图/DFD概念符号/流程图分层/数据字典

【软件工程】数据流图/DFD概念符号/流程图分层/数据字典 目录 【软件工程】数据流图/DFD概念符号/流程图分层/数据字典 一、数据流图 ( DFD ) 简介 二、数据流图 ( DFD ) 概念符号 1、数据流 2、加工 ( 核心 ) 3、数据存储 4、外部实体 三、数据流图 ( DFD ) 分层 1、…

python制作小程序制作流程,用python编写一个小程序

这篇文章主要介绍了python制作小程序代码宠物运输&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 1 importtkinter2 importtkinter.messagebox3 importmath4 classJSQ:5 6 7 d…