热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python多线程爬虫爬取电影天堂资源

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

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

#解析首页
def CrawIndexPage(starturl):
print "正在爬取首页"
page = __getpage(starturl)
if page=="error":
return
page = page.decode('gbk', 'ignore')
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@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("//p[@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(&#39;gbk&#39;, &#39;ignore&#39;)
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@align=&#39;left&#39;]//table//a")
try:
source = filedir + "/" + filename + ".txt"
f = open(source.decode("utf-8"), &#39;w&#39;)
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上面去下载(点我跳转)

最后爬取的结果如下。

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

更多Python多线程爬虫爬取电影天堂资源相关文章请关注PHP中文网!

推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • PHPMailer邮件类邮件发送功能的使用教学及注意事项
    本文介绍了使用国外开源码PHPMailer邮件类实现邮件发送功能的简单教学,同时提供了一些注意事项。文章涵盖了字符集设置、发送HTML格式邮件、群发邮件以及避免类的重定义等方面的内容。此外,还提供了一些与PHP相关的资源和服务,如传奇手游游戏源码下载、vscode字体调整、数据恢复、Ubuntu实验环境搭建、北京爬虫市场、进阶PHP和SEO人员需注意的内容。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • Python开源库和第三方包的常用框架及库
    本文介绍了Python开源库和第三方包中常用的框架和库,包括Django、CubicWeb等。同时还整理了GitHub中最受欢迎的15个Python开源框架,涵盖了事件I/O、OLAP、Web开发、高性能网络通信、测试和爬虫等领域。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • mui框架offcanvas侧滑超出部分隐藏无法滚动如何解决
    web前端|js教程off-canvas,部分,超出web前端-js教程mui框架中off-canvas侧滑的一个缺点就是无法出现滚动条,因为它主要用途是设置类似于qq界面的那种格 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了在Python中检查字符串是否为字母、数字或空白字符的几种方法,包括使用str.isalnum()、str.isalpha()、str.isdigit()和str.isspace()等函数进行判断。 ... [详细]
author-avatar
18X712BB_923
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有