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


Posted in Python onSeptember 23, 2016

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

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

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

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

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

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

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

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

#解析首页
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上面去下载(点我跳转)

最后爬取的结果如下。

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

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

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

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

Python 相关文章推荐
Python网络爬虫中的同步与异步示例详解
Feb 03 Python
Python使用pyh生成HTML文档的方法示例
Mar 10 Python
python实现写数字文件名的递增保存文件方法
Oct 25 Python
Python列表元素常见操作简单示例
Oct 25 Python
PyQt5多线程刷新界面防假死示例
Dec 13 Python
python Qt5实现窗体跟踪鼠标移动
Dec 13 Python
python使用rsa非对称加密过程解析
Dec 28 Python
python 控制台单行刷新,多行刷新实例
Feb 19 Python
详解Python中pyautogui库的最全使用方法
Apr 01 Python
关于django python manage.py startapp 应用名出错异常原因解析
Dec 15 Python
python UDF 实现对csv批量md5加密操作
Jan 01 Python
Python中with上下文管理协议的作用及用法
Mar 18 Python
Python 爬虫模拟登陆知乎
Sep 23 #Python
python 自动化将markdown文件转成html文件的方法
Sep 23 #Python
Python增量循环删除MySQL表数据的方法
Sep 23 #Python
教你用Python脚本快速为iOS10生成图标和截屏
Sep 22 #Python
Python 制作糗事百科爬虫实例
Sep 22 #Python
Python 使用SMTP发送邮件的代码小结
Sep 21 #Python
Python 使用requests模块发送GET和POST请求的实现代码
Sep 21 #Python
You might like
php zip文件解压类代码
2009/12/02 PHP
php中session过期时间设置及session回收机制介绍
2014/05/05 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
PHP转换文本框内容为HTML格式的方法
2016/07/20 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
2019/06/12 PHP
基于jQuery的仿flash的广告轮播
2010/11/05 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
浅谈JavaScript字符串拼接
2015/06/25 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
详解微信小程序开发之——wx.showToast(OBJECT)的使用
2017/01/18 Javascript
jQuery 实现图片的依次加载图片功能
2017/07/06 jQuery
用JS实现简单的登录验证功能
2017/07/28 Javascript
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
2019/05/07 Python
python绘制评估优化算法性能的测试函数
2019/06/25 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
探究 canvas 绘图中撤销(undo)功能的实现方式详解
2018/05/17 HTML / CSS
警察思想汇报
2014/01/04 职场文书
八项规定整改方案
2014/02/21 职场文书
难忘的一课教学反思
2014/04/30 职场文书
网络技术专业求职信
2014/05/02 职场文书
怎样写离婚协议书
2014/09/10 职场文书
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
职工培训工作总结
2015/08/10 职场文书
个人向公司借款协议书
2016/03/19 职场文书