点击上方“何俊林”,马上关注,每天早上8:50准时推送

真爱,请置顶或星标

本文作者:羽翼,原文链接:https://www.cnblogs.com/fwc1994/p/5878934.html

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

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

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

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

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

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

#解析首页
def CrawIndexPage(starturl):print "正在爬取首页"page = __getpage(starturl)if page=="error":returnpage = 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):passelse:try:catalog = node.xpath("text()")[0].encode("utf-8")newdir = "E:/电影资源/" + catalogos.makedirs(newdir.decode("utf-8"))print "创建分类目录成功------"+newdirthread = myThread(host + url, newdir,CrawledURLs)thread.start()except:pass

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

②解析每个分类的主页

# 解析分类文件
def CrawListPage(indexurl,filedir,CrawledURLs):print "正在解析分类主页资源"print indexurlpage = __getpage(indexurl)if page=="error":returnCrawledURLs.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):passelse:#文件命名是不能出现以下特殊符号filename=node.xpath("text()")[0].encode("utf-8").replace("/"," ")\.replace("\\"," ")\.replace(":"," ")\.replace("*"," ")\.replace("?"," ")\.replace("\""," ")\.replace("<", " ") \.replace(">", " ")\.replace("|", " ")CrawlSourcePage(host + url,filedir,filename,CrawledURLs)passelse:# 分页地址 从中嵌套再次解析print "分页地址 从中嵌套再次解析",urlindex = indexurl.rfind("/")baseurl = indexurl[0:index + 1]pageurl = baseurl + urlif __isexit(pageurl,CrawledURLs):passelse:print "分页地址 从中嵌套再次解析", pageurlCrawListPage(pageurl,filedir,CrawledURLs)passpass

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

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

#处理资源页面 爬取资源地址
def CrawlSourcePage(url,filedir,filename,CrawledURLs):print urlpage = __getpage(url)if page=="error":returnCrawledURLs.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.Threaddef __init__(self, url, newdir,CrawledURLs):threading.Thread.__init__(self)self.url = urlself.newdir = newdirself.CrawledURLs=CrawledURLsdef run(self):                   #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数CrawListPage(self.url, self.newdir,self.CrawledURLs)

以上只是部分代码,全部代码可以点击阅读原文去github下载。

最后爬取的结果如下。

说句题外话,有不少人想加鱼哥微信,鱼哥姑且放出来,但是坑位有限哦

 推荐阅读

Java线程基础回顾及内存模型,看你还记得多少?

那些年,让我面试头大的几个排序算法,今天终于搞懂了!

刷了一个半月算法题,我薪资终于Double了

你的 APP 为何启动那么慢?

喜欢就点个在看吧

我用Python爬了点你们需要的电影,这些电影真的很不错~相关推荐

  1. python爬电影的优点是_我用 Python 爬了点你们喜欢的电影,这些电影真的很不错!...

    最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址.刚开始学习python希望可以获得宝贵的意见. 先来简单介绍一下,网络爬虫的基本实现原理吧. 一个爬虫 ...

  2. 用 Python 爬取电影,这些电影真的很不错

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  3. 用 Python 爬了点你们喜欢的电影,这些电影真的很不错

    l最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址.刚开始学习python希望可以获得宝贵的意见. 先来简单介绍一下,网络爬虫的基本实现原理吧. 一个爬 ...

  4. 我用 Python 爬了点你们喜欢的电影,这些电影真的很不错

    点击"开发者技术前线",选择"星标?" 13:21 在看|星标|留言,  真爱 最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资 ...

  5. python爬取淘票票正在热映电影

    源代码 from bs4 import BeautifulSoup import requests import json ''' 遇到不懂的问题?Python学习交流群:1136201545满足你的 ...

  6. 2-2 用Python爬取银河演员网上的演员参演电影的信息进行抓取

    脚本中用到的actors_use.csv为之前从豆瓣上抓取的演员列表. 1 galaxyactors.py 2 # -*- coding: utf-8 -*- 3 #该脚本可以按照文件actors_u ...

  7. python echo命令_echo命令详解 (一) 真的很详细

    echo命令是linux中最基础的命令,也是很常用的命令,特别是在写shell脚本的时候,可能会经常被用到,虽然echo命令非常基础,但是功能还算丰富,此处对echo命令的常用方法进行总结,并给出示例 ...

  8. python画哪吒_用Python爬取暑期档大火的《哪吒》,20W+评论数据,我们分析一波...

    原标题:用Python爬取暑期档大火的<哪吒>,20W+评论数据,我们分析一波 说起这个暑期档的动画片,非<哪吒之魔童降世>莫属了! 上映第 1 天:89分钟,中国动画最快破 ...

  9. 用Python爬取淘宝2000款套套,我发现了一个重要秘密

    点击上方"码农突围",马上关注,每天早上8:50准时推送 真爱,请置顶或星标 一.淘宝商品信息爬取 这篇文章主要是讲解如何爬取数据,数据的分析放在下一篇.之所以分开是因为爬取淘宝遇 ...

  10. Python爬取门户论坛评论

    环境: Python3 + windows. 开发工具:Anaconda + Jupyter / VS Code. 学习效果: 认识爬虫 / Robots协议 了解浏览器开发者工具 动态加载页面的处理 ...

最新文章

  1. 腾讯最大股东收购了 Stack Overflow,以后“抄代码”都要付费了么?
  2. zabbix mysql监控告警_Zabbix监控mysql配置及故障告警配置
  3. Redis数据类型--集合类型
  4. 爱站CMS综合管理系统源码php版
  5. vue 根据字符串生成表单_vue 中怎么渲染字符串形式的组件标签?
  6. Hadoop4——HA集群的搭建(高可用)
  7. Spatial Pyramid的BOW和Pyramid HOG的多核
  8. windows nginx 停止和启动_Nginx安装过程详解
  9. 线性系统和非线性系统
  10. 丽丽的redhat终于可以上网了
  11. 蓝桥杯 历届试题 史丰收速算
  12. 人工智能没成果,年底的PPT怎么写?腾讯科学家张潼离职的后续讨论
  13. js抓取字符串中的电话号码
  14. WebView 视频播放,全屏按钮显示不出来,全屏后不能播放视频
  15. 浅谈人工智能:现状、任务、构架与统一
  16. 【高等数学】二元函数的奇偶性与对称性
  17. 战地3皓月服务器的账号,【国内流畅联机 / 免橘子】皓月云-战地4 使用方法 !战士招募!...
  18. nginx——keepalived
  19. java习题8,java试题练习题(第8套
  20. 系统升级: PHP(5.1.6-5.4.7) CI(1.7.2-2.1.2)调查记录

热门文章

  1. java服务端验证框架_SpringBoot服务端数据校验过程详解
  2. VS2017编写C++多文件时,出现LNK2005、LNK1169报错的解决方法
  3. VINS-Fusion如何高效学习?
  4. 多线程和多进程的区别
  5. IPVS和Nginx两种WRR负载均衡算法详解
  6. VCS学习(2)debug simulation mismatches
  7. Ajax 调用(传值)一般处理程序(.ashx)
  8. 苹果iOS苹果公司的手机用户都有权索赔
  9. 用Ruby读取Excel文件
  10. 【OpenCV学习笔记】【函数学习】十六(Rect参数介绍)