使用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 14 Python
详解Python中用于计算指数的exp()方法
May 14 Python
Python的argparse库使用详解
Oct 09 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
Nov 11 Python
python正则表达式匹配IP代码实例
Dec 28 Python
python + selenium 刷B站播放量的实例代码
Jun 12 Python
python文件及目录操作代码汇总
Jul 08 Python
利用python对mysql表做全局模糊搜索并分页实例
Jul 12 Python
Python实现文件压缩和解压的示例代码
Aug 12 Python
Python实现定时监测网站运行状态的示例代码
Sep 30 Python
Python的scikit-image模块实例讲解
Dec 30 Python
python 如何将两个实数矩阵合并为一个复数矩阵
May 19 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中几个常用的魔术常量
2012/02/23 PHP
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
laravel中的fillable和guarded属性详解
2019/10/23 PHP
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
2013/11/14 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
理解js回收机制通俗易懂版
2016/02/29 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
浅谈$_FILES数组为空的原因
2017/02/16 Javascript
详解webpack和webpack-simple中如何引入css文件
2017/06/28 Javascript
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
使用react context 实现vue插槽slot功能
2019/07/18 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
vue element-ui实现动态面包屑导航
2019/12/23 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
python实现八大排序算法(1)
2017/09/14 Python
Django框架多表查询实例分析
2018/07/04 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
Python Pandas list列表数据列拆分成多行的方法实现
2020/12/14 Python
Clarisonic美国官网:科莱丽声波洁面仪
2017/10/12 全球购物
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
会计学生自我鉴定
2014/02/06 职场文书
爱护公物演讲稿
2014/09/09 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书
如何在pycharm中快捷安装pip命令(如pygame)
2021/05/31 Python
python图像处理 PIL Image操作实例
2022/04/09 Python