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,一经查实,立即删除!

相关文章

打不开磁盘配额linux,九度OJ 1455 珍惜现在,感恩生活 -- 动态规划(背包问题)...

题目描述&#xff1a;为了挽救灾区同胞的生命&#xff0c;心系灾区同胞的你准备自己采购一些粮食支援灾区&#xff0c;现在假设你一共有资金n元&#xff0c;而市场有m种大米&#xff0c;每种大米都是袋装产品&#xff0c;其价格不等&#xff0c;并且只能整袋购买。请问&#xf…

erp 维护费 要交吗_ERP系统维护费

今年8月&#xff0c;SAP中国公司宣布2009年1月1日前将由传统支持服务转向企业级支持服务(SAP Enterprise Support)。同时将开始实施渐进式定价方案&#xff0c;并预计在2012年之前&#xff0c;逐渐将所有客户从现行的SAP Standard/Premium Support的定价协议过渡为SAP Enterpri…

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…

linux桌面时区设置,如何在Ubuntu 20.04上设置或更改时区

对于许多与系统相关的任务和进程&#xff0c;使用正确的时区至关重要。 例如&#xff0c;cron守护程序使用系统的时区执行cron作业&#xff0c;而日志文件中的时间戳基于系统的同一时区。在Ubuntu上&#xff0c;系统的时区是在安装过程中设置的&#xff0c;但以后可以轻松更改。…

ironpython2.7.9_IronPython下载

IronPython是一种在 .NET 及 Mono上的 Python 实现&#xff0c;由微软的 Jim Hugunin所发起&#xff0c;是一个开源的项目&#xff0c;基于微软的DLR引擎&#xff1b;托管于微软的开源网站 CodePlex。IronPython 的官方并未实现 Python通用类库&#xff0c;仅实现了部分核心类。…

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

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

天宫初级认证答案_跨境电商人才初级认证试题以及答案

跨境电商人才初级认证试题以及答案跨境电商人才初级认证试题一&#xff0c;单选题(共40题,每题1分,共40分)1.在拍摄反光性产品时,就是从哪个角度进行拍摄的A、正面B、侧面参考答案:B2.信用证就是一种( )信用A、商业B、银行C、民间D、企业参考答案:B3、阿里巴巴专业术语中,MA的全…

Linux打包软件版本带时间,带你写一个 linux 下的打包软件 tar

相信你对 linux 的 .tar.gz 有点熟悉&#xff0c;这就是先 tar 打包(.tar 后缀)&#xff0c;再对此 tar 文件用 gzip 压缩(.tar.gz)的后缀名。值得注意的是&#xff0c; tar 不是压缩软件&#xff0c;它只做把一堆文件/文件夹打包到一个文件(tar 文件)里的事情&#xff0c;而文…

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

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

螺旋测微器b类不确定度_物理实验直测量不确定度评估.ppt

物理实验直测量不确定度评估直接测量不确定度评估 Gauss分布 测量列的平均值、标准差 A类不确定度 t分布 B类不确定度 直接测量的合成不确定度 Gauss分布 也称正态分布。 δ的平均值等于0、方差为σ。 特征&#xff1a; 对称性——大于平均值与小于平均值的概率相等&#xff1b…

python 执行shell_python执行shell命令的方法

python执行shell命令的方法 os模块 os.system方式&#xff1a; import os os.system(top) os.system(cat /proc/cpuinfo) 说明 这个调用相当直接&#xff0c;且是同步进行的&#xff0c;程序需要阻塞并等待返回。 返回值是依赖于系统的&#xff0c;直接返回系统的调用返回值&am…

linux下c语言读取roed文件,如何在Linux系统上安装Android4.4.docx

Android (x86)项目致力于移植 Android系统到X86处理器上&#xff0c;使用户可以更容易的在任何电脑上安装Android。他们通过使用android源码&#xff0c;增加补丁来使 Android能够在X86处理器&#xff0c;笔记本电脑和平板 电脑下工作。前一段时间&#xff0c;项目组发布了最新…

微信小程序setinterval_简单谈谈setTimeout与setInterval

感谢踩过的坑sf社区的第一篇文章。最近在做一个拍卖的微信小程序&#xff0c;用到了定时器setTimout和setInterval,简单谈谈这两个api。setTimeout最常见的用法就是第二种(第三种mdn文档不推荐)&#xff0c;如:var timeoutId setTimeout(function() {console.log(hello world!…

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。无奈将其卸…

transporter上传卡正在交付_【iOS】Xcode11使用Transporter将APP上传到App Store,卡在正在验证APP...

问题&#xff1a;在使用Transporter时&#xff0c;会卡主&#xff0c;一直显示正在验证APP在这里插入图片描述解决方案一&#xff1a;利用V-P-N在这里插入图片描述使用安全上网(V-P-N)&#xff0c;双击打开iTMSTransporter&#xff0c;等待几分钟lichuangMacBook-Pro-3 ~ % /Ap…

python练手经典100例微盘_20个Python练手经典案例,能全做对的人确实很少!

100个Python练手小程序&#xff0c;学习python的很好的资料&#xff0c;覆盖了python中的每一部分&#xff0c;可以边学习边练习&#xff0c;更容易掌握python。 如果你感觉学不会&#xff1f;莫慌&#xff0c;小编推荐大家加入群&#xff0c; 前面548中间377后面875&#xff0…

小红帽linux各功能中英,英文短剧《小红帽》剧本台词完整版---中英对照文本版...

大灰狼和小红帽的故事红帽第一场&#xff1a;小红帽家 妈妈&#xff1a; (妈妈拿着一个篮子&#xff0c;把桌子上的水果放在篮子里) 小红帽唱着歌&#xff0c;欢快地跑进来)Hi,mummy, what are you doing? 嘿&#xff0c;妈妈 你在什么&#xff1f; 妈妈&#xff1a; (一边把水…

uipath循环datatable_UiPath之DataTable转换为List和Array

今天给大家分享一下&#xff0c;如何将DataTable转为List和Array&#xff0c;为此小U也花了不少时间研究&#xff0c;最后发现没有那么复杂。先来说说List和Array的区别&#xff1a;List&#xff1a;就像一个链条&#xff0c;存储数据的空间可以不连续。Array&#xff1a;就像一…

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

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