使用爬虫爬取某电影分享网站最新电影链接 -- 基于Python Requests库
前提:
我弟在搞微信群营销,使用了一个第三方微信机器人软件来群发“最新电影链接”,看着别人群里分享的各种短域名,自己却没有资源,于是来求助我,虽然对爬虫有点了解,但是从来没亲自做过爬虫,只能硬着头皮上了,于是就有了下面这个全过程。
准备工作:
先是理解一下他的需求,就是想要一个最新电影的链接,然后还要可以根据群成员的提问,比如有成员发送“爱情公寓”,那么就要通过机器人返回给“爱情公寓”的在线观看链接,形式必须是短域名,可通过手机在线观看,至于是正版还是TS,无所谓!
我需要做的,只是提供最新的电影链接,后面的工作都是微信群机器人的工作,听上去好像还没那么复杂,我只需要找到一个可以稳定观看最新电影视频的网站,然后将其播放链接爬下来,再通过网上提供的短域名转换API接口,转换为短域名,保存到本地的一个文件,供其使用即可。
说实话,这种想不劳而获,一分钱不花,就观看最新影院电影的方式,无论是通过度娘,还是谷哥,都好难找啊,不是没有,是很多,但是都是各种黑链,非常之不安全,而且这些链接,发送到微信后,都会被微信屏蔽禁止访问。
千辛万苦,总算是找到了一个网站,这里不想被认为有推广嫌疑,所以不写其网站大名了,但是这个分享网站还真是挺好的,各种乱七八糟的东西全都有,里面有个专题,就是专门分享最新电影链接的,而且都是短域名,连转换的步骤都省了,直接爬下来,存储到本地即可。
分析工作:
网站找到了,接下来就是分析一下爬虫具体要做的事情,因为这个网页分享的链接,网页源代码相当粗糙,一步一步来:
第一步,先把指定的分享页面打开,爬取回来;
第二步,将全部的短域名过滤出来,存储在一个列表里;
第三步,再逐一将这些短域名打开,从中获取到这个视频的标题,也就是电影名称;
第四步,将电影名称,对应的短域名,都存储在本地文件里,OK,完成。
这么分析下来,好像比预计的要简单很多哦!
实际编写:
使用requests库,进行页面的爬取,将整个页面存储到变量中;
使用re库,进行指定内容的过滤筛选,将筛选结果存储到变量中;
使用os、logging库进行辅助功能的实现;
完整代码如下:
#!/usr/bin/python
# -*- coding:utf-8 -*"""
Function: 爬取最新在线电影存储在本地
Create Time: 2018年08月12日 星期日 15时57分06秒
Author: **********@qq.com
"""import os
import re
import requests
import logginglogging.basicConfig(filename=str(os.getcwd())+'\getmovieurl.log', level=logging.INFO, format='%(asctime)s [%(name)s] %(message)s')
logger = logging.getLogger('getmovieurl')class GETMOVIEURL():"""通过一个福利巢的一个分享站点抓取最新的在线电影链接"""def __init__(self):self.init_url = "https://www.******.com/3971.html"self.dir_name = os.getcwd()def get_movie_url(self):"""抓取全部在线电影的短域名"""try:self.response = requests.get(self.init_url)self.movie_urls = re.findall('<span style="color: #333333; text-decoration: underline;">(.*?)</span>', self.response.text)except Exception as e:logger.error("电影链接获取异常:%s" % str(e))def get_movie_name(self):"""通过短域名链接获取视频名称"""try:with open(str(self.dir_name) + '\\result.txt', 'w') as f:for i in range(1,len(self.movie_urls)):self.response = requests.get(str(self.movie_urls[i]))self.movie_name = re.findall('<title>(.*?)</title>', self.response.text)if self.movie_name:print "获取到最新电影:%s" % self.movie_name[0].encode('UTF-8')f.write("{} {}\n".format(self.movie_name[0].encode('UTF-8'), self.movie_urls[i]))else:continueexcept Exception as e:logger.error("电影名称获取异常:%s %s" % (str(e), str(self.movie_urls[i])))if __name__ == "__main__":print "正在抓取最新电影在线视频链接请等待......"movie = GETMOVIEURL()movie.get_movie_url()movie.get_movie_name()print "链接获取完毕请查看文件:result.txt......"
问题分析:
过程中,遇到了很多小问题,在这里和大家逐一分析一下:
首先是第一版的时候,没有加异常捕获,结果导致有些视频网站在打开时遇到异常退出,并没有成功抓取到;
然后是过滤不到想要的内容,先来看一下抓取网页里的源代码:
<strong>一出好戏:</strong><span style="color: #333333; text-decoration: underline;">http://t.cn/RDlKmog</span><br />
我要过滤出电影名“一出好戏”,还有后面的短域名链接“http://t.cn/RDlKmog”,但是如果只使用strong关键字来过滤,会过滤出太多杂项,真心不是想要的结果,没办法,只能先过滤短域名,短域名的过滤,也遇到了点问题,就是使用正则表达式没过滤出短域名:"(*?)"
,这块具体的解释是这样:
(.*)
第一个匹配分组,.*
代表匹配除换行符之外的所有字符(.*?)
第二个匹配分组,.*?
后面多个问号,代表非贪婪模式,也就是说只匹配符合条件的最少字符后面的一个
.*
没有括号包围,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中
修改后的代码如下:
re.findall('<span style="color: #333333; text-decoration: underline;">(.*?)</span>', self.response.text)
这样就能过滤出每个电影的短域名了。
再然后,就是通过直接打开短域名来获取电影标题,也就是这个电影的真正名字,但是吧,居然有的电影没有标题,也就是为空,这个时候又报错了,无奈只能添加if判断,为空的都跳出循环,继续寻找下一个电影;
再然后,就是从网页里爬取回来的电影名,我想一边爬取,一边打印出来,以便于可以实时观察到结果,但是吧,这个名字在我的测试环境Ubuntu 18.04下,控制台里都是乱码,没办法,只能把抓取回来的电影名重新编码一下,这块又是涉及到unicode字符和中文字符的编码问题,修改后的代码如下:
print "获取到最新电影:%s" % self.movie_name[0].encode('UTF-8')
最后,因为程序是要给别人使用的,也不知道他最终会将程序放在哪,所以需要获取脚本所在路径,然后把结果和日志,都存储在当前目录下。
最后的最后,也不知道人家电脑里有没有python程序,所以就想着,要是能打包成exe可执行文件,岂不是很方便了。
转换过程:
参考请教了一下CSDN里的其他人文章,找到一个方法,详情可参考文章:
https://blog.csdn.net/woshisangsang/article/details/73230433
但我在实际过程中,遇到了一些问题:
首先,我的windows 7是64bit的,结果我安装的python 32bit版本,我参考这篇文章安装了32bit对应的版本,结果pyinstaller的安装过程中,会提示环境错误;
然后我卸载了32bit版本,改安装64bit版本,结果最后还是有错误,没办法,我只能连带着把python都卸载了,重新安装一个和系统版本匹配的64bit版本python,再安装pyinstaller、pywin32的64bit版本,最后就正常了。
不过最终转换出来的程序,实际执行过程中,还是会报错,很无语,因为缺少库,requests库不是python默认库,只能通过第三方安装,所以,这个exe的转换不算成功,还得想办法解决库依赖的问题,这个我还在研究,研究好了再来分享。
使用爬虫爬取某电影分享网站最新电影链接 -- 基于Python Requests库相关推荐
- Python:网络爬虫爬取某表情包网站
Python:网络爬虫爬取某表情包网站 参考: 爬虫基础知识点汇总(html文件基础和4个常用库 超级详细长文预警) [爬虫教程]吐血整理,最详细的爬虫入门教程~ HTML的简单介绍 HTML的全称为 ...
- 写一个爬虫爬取boss直聘网站
好的,我可以为您简要介绍如何编写一个爬虫来爬取 BOSS 直聘网站. 首先,您需要准备好以下几个东西: 安装 Python,并使用 pip 安装爬虫所需的库,如 requests 和 Beautifu ...
- python爬音乐网站_python爬虫-爬取高逼格音乐网站《落网》
关于 落网,一个高逼格的音乐网站,是很多文艺青年经常逛的网站.经常下载落网音乐到本地,一首一首的下载十分的痛苦.最近刚好在学习python爬虫的东西,刚好把落网音乐的爬取当做一个练习项目来实践(IT从 ...
- 爬虫爬取在线小说阅读网站详解
前言 环境:python 安装.requests安装.Beautiful Soup安装 爬取目标: 笔趣看网站的<校花之贴身高手>,以下是第一章链接 https://www.biqukan ...
- Python爬虫爬取某盗版小说网站小说.
前言 我将这个程序分为两个功能,一是实现爬取小说的最新章节,二是爬取小说的所有章节. 仅供学习. 获取小说详情页的html 通过函数gethtml()实现. def gethtml(url):#得到小 ...
- 网络爬虫学习2 - 爬取网页的通用代码框架、HTTP协议、Requests库的各种方法
网络爬虫MOOC学习打卡 - 第二天 文章目录 网络爬虫MOOC学习打卡 - 第二天 一.爬取网页的通用代码框架 1.理解requests库的异常 2.Respones类提供了一个方法 -- r.ra ...
- python爬虫爬取微信_Python爬虫爬取微信公众号历史文章全部链接
因为朋友问我能不能找一下一个微信公众号的全部历史文章的链接,我就帮他弄了一下,通过百度和谷歌发现现在大家爬微信公众号的思路基本都是下面两种: 通过搜狗搜索微信公众号然后拿到链接 通过fiddler检测 ...
- python公众号文章爬虫_Python爬虫爬取微信公众号历史文章全部链接
因为朋友问我能不能找一下一个微信公众号的全部历史文章的链接,我就帮他弄了一下,通过百度和谷歌发现现在大家爬微信公众号的思路基本都是下面两种: 通过搜狗搜索微信公众号然后拿到链接 通过fiddler检测 ...
- python爬取公众号历史文章_Python爬虫爬取微信公众号历史文章全部链接
因为朋友问我能不能找一下一个微信公众号的全部历史文章的链接,我就帮他弄了一下,通过百度和谷歌发现现在大家爬微信公众号的思路基本都是下面两种: 通过搜狗搜索微信公众号然后拿到链接 通过fiddler检测 ...
最新文章
- 3天,把MySQL索引、锁、事务、分库分表撸干净了!
- 当电信诈骗犯遇上程序员,技术决定成败!
- x86 32位oracle,X86 32位和64位的区别
- ai训练 样本大小_防止过拟合(三):数据增强(增加训练样本)
- java构造反射和函数_反射类的构造函数和方法
- matlab中的count函数,Excel 中COUNT函数的使用详解,详情介绍
- 利用unittest+ddt进行接口测试(二):使用yaml文件管理测试数据
- 企业项目运行管理体系的实现
- linux gdb 导出到文件怎么打开,GDB基本命令从打开文件到调试结束的教程
- THCudaCheck FAIL file=/pytorch/aten/src/THC/THCGeneral.cpp line=405 error=11 : invalid argument
- 总结 | 六大路径规划算法
- stm32—光敏电阻传感器的初步使用
- logistic回归分析优点_SPSS统计分析全解析Logistic回归(逻辑回归)
- go fyne 跨平台开发框架 gui 编程 抖音下载 去水印编程 学习交流
- 分享一个我常用的信息差赚钱渠道
- 济南 章丘 科目三 资料 收集
- CA(载波聚合)和MIMO
- Conventional Commits那些事
- 三角函数对应在平面坐标上画圆
- MCAL_VADC配置
热门文章
- FreeBSD常用命令 110 条
- input验证邮箱 css,jquery验证邮箱格式并显示提交按钮
- Java Excel 复制单元格 poi Excel 复制单元格 Java Excel 复制行 Java Excel 复制 sheet 页 poi excel copy
- 汽车多媒体主机接口EMC设计
- 12 如何用网格策略网住收益?——实操篇
- Android 高德地图(带有定位和点击显示经度纬度)
- 【项目】小帽商城 II(一)
- 自行实现 Onvif 对接开发模式
- 【自定义Matlab函数】利用Kronecker积求解矩阵方程AXB=D
- MATLAB---读取STL文件并解析