python爬电影_使用Python多线程爬虫爬取电影天堂资源

最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载。刚开始学习python希望可以获得宝贵的意见。

先来简单介绍一下,网络爬虫的基本实现原理吧。一个爬虫首先要给它一个起点,所以需要精心选取一些URL作为起点,然后我们的爬虫从这些起点出发,抓取并解析所抓取到的页面,将所需要的信息提取出来,同时获得的新的URL插入到队列中作为下一次爬取的起点。这样不断地循环,一直到获得你想得到的所有的信息爬虫的任务就算结束了。我们通过一张图片来看一下。

20160923162204107.png

好的 下面进入正题,来讲解下程序的实现。

首先要分析一下电影天堂网站的首页结构。

20160923162204108.png

从上面的菜单栏中我们可以看到整个网站资源的总体分类情况。刚刚好我们可以利用到它的这个分类,将每一个分类地址作为爬虫的起点。

①解析首页地址 提取分类信息

#解析首页

def CrawIndexPage(starturl):

print "正在爬取首页"

page = __getpage(starturl)

if page=="error":

return

page = page.decode('gbk', 'ignore')

tree = etree.HTML(page)

Nodes = tree.xpath("//div[@id='menu']//a")

print "首页解析出地址",len(Nodes),"条"

for node in Nodes:

CrawledURLs = []

CrawledURLs.append(starturl)

url=node.xpath("@href")[0]

if re.match(r'/html/[A-Za-z0-9_/]+/index.html', url):

if __isexit(host + url,CrawledURLs):

pass

else:

try:

catalog = node.xpath("text()")[0].encode("utf-8")

newdir = "E:/电影资源/" + catalog

os.makedirs(newdir.decode("utf-8"))

print "创建分类目录成功------"+newdir

thread = myThread(host + url, newdir,CrawledURLs)

thread.start()

except:

pass

在这个函数中,首先将网页的源码下载下来,通过XPath解析出其中的菜单分类信息。并创建相应的文件目录。有一个需要注意的地方就是编码问题,但是也是被这个编码纠缠了好久,通过查看网页的源代码,我们可以发现,网页的编码采用的是GB2312,这里通过XPath构造Tree对象是需要对文本信息进行解码操作,将gb2312变成Unicode编码,这样DOM树结构才是正确的,要不然在后面解析的时候就会出现问题。

②解析每个分类的主页

# 解析分类文件

def CrawListPage(indexurl,filedir,CrawledURLs):

print "正在解析分类主页资源"

print indexurl

page = __getpage(indexurl)

if page=="error":

return

CrawledURLs.append(indexurl)

page = page.decode('gbk', 'ignore')

tree = etree.HTML(page)

Nodes = tree.xpath("//div[@class='co_content8']//a")

for node in Nodes:

url=node.xpath("@href")[0]

if re.match(r'/', url):

# 非分页地址 可以从中解析出视频资源地址

if __isexit(host + url,CrawledURLs):

pass

else:

#文件命名是不能出现以下特殊符号

filename=node.xpath("text()")[0].encode("utf-8").replace("/"," ")\

.replace("\\"," ")\

.replace(":"," ")\

.replace("*"," ")\

.replace("?"," ")\

.replace("\""," ")\

.replace("<", " ") \

.replace(">", " ")\

.replace("|", " ")

CrawlSourcePage(host + url,filedir,filename,CrawledURLs)

pass

else:

# 分页地址 从中嵌套再次解析

print "分页地址 从中嵌套再次解析",url

index = indexurl.rfind("/")

baseurl = indexurl[0:index + 1]

pageurl = baseurl + url

if __isexit(pageurl,CrawledURLs):

pass

else:

print "分页地址 从中嵌套再次解析", pageurl

CrawListPage(pageurl,filedir,CrawledURLs)

pass

pass

打开每一个分类的首页会发现都有一个相同的结构(点击打开示例)首先解析出包含资源URL的节点,然后将名称和URL提取出来。这一部分有两个需要注意的地方。一是因为最终想要把资源保存到一个txt文件中,但是在命名时不能出现一些特殊符号,所以需要处理掉。二是一定要对分页进行处理,网站中的数据都是通过分页这种形式展示的,所以如何识别并抓取分页也是很重要的。通过观察发现,分页的地址前面没有“/”,所以只需要通过正则表达式找出分页地址链接,然后嵌套调用即可解决分页问题。

③解析资源地址保存到文件中

#处理资源页面 爬取资源地址

def CrawlSourcePage(url,filedir,filename,CrawledURLs):

print url

page = __getpage(url)

if page=="error":

return

CrawledURLs.append(url)

page = page.decode('gbk', 'ignore')

tree = etree.HTML(page)

Nodes = tree.xpath("//div[@align='left']//table//a")

try:

source = filedir + "/" + filename + ".txt"

f = open(source.decode("utf-8"), 'w')

for node in Nodes:

sourceurl = node.xpath("text()")[0]

f.write(sourceurl.encode("utf-8")+"\n")

f.close()

except:

print "!!!!!!!!!!!!!!!!!"

这段就比较简单了,将提取出来的内容写到一个文件中就行了

为了能够提高程序的运行效率,使用了多线程进行抓取,在这里我是为每一个分类的主页都开辟了一个线程,这样极大地加快了爬虫的效率。想当初,只是用单线程去跑,结果等了一下午最后因为一个异常没处理到结果一下午都白跑了!!!!心累

class myThread (threading.Thread): #继承父类threading.Thread

def __init__(self, url, newdir,CrawledURLs):

threading.Thread.__init__(self)

self.url = url

self.newdir = newdir

self.CrawledURLs=CrawledURLs

def run(self): #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数

CrawListPage(self.url, self.newdir,self.CrawledURLs)

以上只是部分代码,全部代码可以到GitHub上面去下载(点我跳转)

最后爬取的结果如下。

20160923162204109.png

20160923162204110.png

20160923162204111.png

以上所述是小编给大家介绍的使用Python多线程爬虫爬取电影天堂资源 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

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

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

相关文章

sentinel 端口_Sentinel原理:控制台是如何获取到实时数据的

Sentinel 系列教程&#xff0c;现已上传到 github 和 gitee 中&#xff1a;GitHub&#xff1a;https://github.com/all4you/sentinel-tutorialGitee&#xff1a;https://gitee.com/all_4_you/sentinel-tutorialSentinel 能够被大家所认可&#xff0c;除了他自身的轻量级&#x…

python 最小二乘回归 高斯核_「机器学习」一文读懂线性回归、岭回归和Lasso回归...

点击上方蓝色字体&#xff0c;关注AI小白入门哟作者 | 文杰编辑 | yuquanle本文介绍线性回归模型&#xff0c;从梯度下降和最小二乘的角度来求解线性回归问题&#xff0c;以概率的方式解释了线性回归为什么采用平方损失&#xff0c;然后介绍了线性回归中常用的两种范数来解决过…

优先队列默认是小顶堆吗_一分钟带你读懂什么是堆?

堆其实就是一种特殊的队列——优先队列。 普通的队列游戏规则很简单&#xff1a;就是先进先出&#xff1b;但这种优先队列搞特殊&#xff0c;不是按照进队列的时间顺序&#xff0c;而是按照每个元素的优先级来比拼&#xff0c;优先级高的在堆顶。 这也很容易理解吧&#xff0c;…

python 注释一段话_Python快速入门(一)

引言Python作为一个&#xff0c;目前最火的编程语言之一&#xff0c;已经渗透到了各行各业。它易学好懂&#xff0c;拥有着丰富的库&#xff0c;功能齐全。人生苦短&#xff0c;就用Python。这个快速入门系列分为六篇&#xff0c;包含了Python大部分基础知识&#xff0c;每篇阅…

linux ibus获取窗体位置,Ubuntu 12.04 显示ibus 的输入框

在虚拟机中安装了Ubuntu 12.04&#xff0c;系统是英文版本的&#xff0c;我能接受&#xff0c;但是苦于没有中文输入法。起先&#xff0c;我是安装SCIM&#xff0c;结果我折腾了半天&#xff0c;发现其只能在lib-office下使用。firefox,文字编辑器中都不能调出SCIM。无奈将其卸…

python批量下载文件教程_Python抓包菜鸟教程:批量下载图片的方法,电脑和手机都能用...

笔者看上了一组图集&#xff0c;然后准备一张一张下载时&#xff0c;瞄了一眼&#xff0c;这组图集还有100&#xff0c;好吧&#xff0c;我酸了。 笔者就是试试工具&#xff0c;你们别像我这样用&#xff0c;这么好的工具&#xff0c;做自媒体&#xff0c;那绝对了那如何批量下…

esxi挂载Linux的nfs盘,ESXi安装centos7挂载群晖NFS

前段时间折腾了ESXi&#xff0c;然后无尽的折腾接踵而来&#xff0c;今天要说的是如何安装centos7并挂载群晖虚拟机的NFS共享文件夹直接步入正题&#xff01;先是下载centos7镜像&#xff0c;因为我是用来当服务器的&#xff0c;所以只需要minimal版即可【centos下载链接】自己…

传统的6d位姿估计fangfa1_李飞飞团队最新论文:基于anchor关键点的类别级物体6D位姿跟踪...

点击上方“3D视觉工坊”&#xff0c;选择“星标”干货第一时间送达简介作者提出了一种基于RGB-D的深度学习方法6PACK&#xff0c;能够实时的跟踪已知类别物体。通过学习用少量的3D关键点来简洁地表示一个物体&#xff0c;基于这些关键点&#xff0c;通过关键点匹配来估计物体在…

安卓system镜像分区_玩机爱好者想要的PT分区到底是什么?可以使现有的安卓系统更快!...

小编第一次看见PT分区这个词。就比较好奇他到底是什么神仙技术。今天&#xff0c;小编给大家科普一下&#xff0c;可能小编理解的也不是特别准确&#xff0c;请各位谅解&#xff01;&#xff01; 欢迎关注小编。各位玩机爱好者总是沉浸在各种ROM包、第三发Rec&#xff0c;以及各…

python求和1到100_python等差数列求和公式前 100 项的和实例

python等差数列求和公式前 100 项的和实例 最近跑去学了下python,一个很简单的题&#xff0c;结果发现数学公示忘了&#xff0c;在不用for循环的情况下居然有些懵&#xff0c;记录为下.. 题&#xff1a;等差数列可以定义为每一项与它的前一项的差等于一个常数&#xff0c;可以用…

jupyter kernel_新乡联通案例分享:Jupyter开发环境配置的常用技巧

Jupyter开发环境配置的常用技巧新乡联通网管中心 邢少华Python开发环境中&#xff0c;大部分人使用的是Jupyter&#xff0c;在Jupyter中有几个令人困扰的问题&#xff1a;1. Jupyter的默认打开目录如何修改2. Jupyter默认使用的浏览器如何修改3. 好用的Jupyter插件如何安装4.…

二叉树 中序遍历 python_LeetCode 105 树 从前序与中序遍历序列构造二叉树(Medium)

17(105) 从前序与中序遍历序列构造二叉树(Medium)描述根据一棵树的前序遍历与中序遍历构造二叉树。注意: 你可以假设树中没有重复的元素。示例例如&#xff0c;给出前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7]返回如下的二叉树&#xff1a;3/ 9 20/ 1…

计算payload长度c语言,C语言0长度数组(可变数组/柔性数组)详解

1 零长度数组概念众所周知, GNU/GCC 在标准的 C/C 基础上做了有实用性的扩展, 零长度数组(Arrays of Length Zero) 就是其中一个知名的扩展.多数情况下, 其应用在变长数组中, 其定义如下struct Packet{ int state; int len; char cData[0]; //这里的0长结构体就为变长结构体提供…

go语言调用c 的头文件 so,golang 学习(10): 使用go语言调用c语言的so动态库-Go语言中文社区...

一、前言最近在学习go&#xff0c;因为需要调用c语言打包成的so动态库里面的方法&#xff0c;避免自己再去造轮子&#xff0c;所以想直接使用golang调用so&#xff0c;但是参考了其他博客大佬写的&#xff0c;我每一步原封不动的写下来&#xff0c;结果都是一堆错误&#xff0c…

android 开机动画 渐变,[Parallax Animation]实现知乎 Android 客户端启动页视差滚动效果...

前言Parallax Scrolling (视差滚动)&#xff0c;是一种常见的动画效果。视差一词来源于天文学&#xff0c;但在日常生活中也有它的身影。在疾驰的动车上看风景时&#xff0c;会发现越是离得近的&#xff0c;相对运动速度越快&#xff0c;而远处的山川河流只是缓慢的移动着&…

python可以做计量分析吗_技术分享 - python数据分析(2)——数据特征分析(上)...

1 分布分析 分布分析能揭示数据的分布特征和分布类型。对于定量数据&#xff0c;欲了解其分布形式是对称的还是非对称的&#xff0c;发现某些特大或特小的可疑值&#xff0c;可通过绘制频率分布表、绘制频率分布直方图、绘制茎叶图进行直观地分析&#xff1b;对于定性分类数据&…

matlab的7.3版本是什么_乐建工程宝V6.3版本升级说明公告

尊敬的乐建工程宝客户&#xff1a;您好&#xff01;为了给客户提供更加优质的产品和服务&#xff0c;我司已于2019年11月20日开始乐建工程宝V6.3版本升级服务。目前&#xff0c;Android系统各应用市场已基本审核完毕&#xff0c;iOS系统已上传AppStore&#xff0c;目前苹果官方…

origin设置不同区域的颜色_[测试狗]Origin入门教程(二十四):效率翻倍小技巧——修改默认字体...

在使用Origin的时候&#xff0c;对于每次绘图都需要更改字体觉得很麻烦&#xff0c;因为Origin默认的字体为Arial&#xff0c;但是我们常用的字体一般为Times New Roman&#xff0c;在下拉框的很底部&#xff0c;每次更改都很浪费时间。那为什么不把他设置成默认字体呢&#xf…

cgi web 调用多次启动_全面了解CGI、FastCGI、PHPFPM

一、抛个砖1、Web Server传递数据的方法正式说CGI之前&#xff0c;先来了解一下Web Server传递数据的另外一种方法&#xff1a;PHP Module加载方式。相信都会想起Apache吧&#xff0c;初学php时&#xff0c;在windows上安装完php和Apache之后&#xff0c;为了让Apache能够解析p…

mysql 按月和年累加_广西柳州市市场监管局公布市2020年11月(第一批)电梯按需维保试点名单...

中国质量新闻网讯 根据《柳州市改进电梯维护保养模式试点工作方案》&#xff0c;近日&#xff0c;广西柳州市市场监管局公布柳州市首批按需维保试点电梯名单&#xff0c;冠亚蓝湾国际小区和南庆安置小区共46台电梯成为首批试点电梯&#xff0c;标志着柳州市全面启动了按需维保改…