吉游网提供最新游戏下载和手游攻略!

分享部分热门电影资源!快来瞧瞧你的喜好!

发布时间:2024-08-28浏览:95

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

最近花些时间用Python写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址。

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

" image_type="1" mime_type="image/webp" web_uri="pgc-image/a4b82add7a394ac9bedbb60140c3ea83">

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

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

" image_type="1" mime_type="image/webp" web_uri="pgc-image/b18664b388484f7886337caec0e38fc0">

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

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

#解析首页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)

最后爬取的结果如下。

" image_type="1" mime_type="image/webp" web_uri="pgc-image/62ae3c9d5f2e4b9c91893bae474eb233">

" image_type="1" mime_type="image/webp" web_uri="pgc-image/8bac9c102c0c4c85b0354be8ef96857a">

" image_type="1" mime_type="image/webp" web_uri="pgc-image/b4824e85cadc491da0926845d394133e">

用户评论

话扎心

哇!真不错!我最近正好想找一些好看的电影放松一下。

    有6位网友表示赞同!

抚涟i

Python 爬网页?这技术太厉害啦!你能告诉我哪些类型的电影吗?

    有10位网友表示赞同!

你身上有刺,别扎我

我超爱看电影的,快来推荐几个给我看看吧!

    有18位网友表示赞同!

寂莫

要是能知道具体哪部电影就好了,这样我就可以好好地选择一下了。

    有5位网友表示赞同!

短发

这太酷了!爬网页都能看电影,我的编程梦可以实现了么?

    有13位网友表示赞同!

繁华若梦

我喜欢这类创意满满的游戏,感觉很有趣。

    有6位网友表示赞同!

一个人的荒凉

我超期待你的电影推荐!好久没看过新片了,希望能有惊喜啊。

    有12位网友表示赞同!

我一个人

Python 都是高难度程序吧?竟然能用它爬电影,厉害的样子!

    有9位网友表示赞同!

迁心

如果你还能分享一下爬数据的思路,那真是太棒啦!我能学习到很多东西。

    有9位网友表示赞同!

罪歌

希望这些电影不是那些烂片啊

    有14位网友表示赞同!

醉婉笙歌

码下是什么意思啊?难道是下载吗? 我要试试看!

    有20位网友表示赞同!

拽年很骚

这种游戏让我感觉很有参与感,期待更多玩家分享。

    有5位网友表示赞同!

半梦半醒半疯癫

我喜欢这种挑战性的游戏,而且还能学习到新的知识,简直不要太完美!

    有8位网友表示赞同!

蹂躏少女

如果能根据我们的喜好推荐电影就好了!这才是最大的收获吧~

    有10位网友表示赞同!

鹿叹

希望我的类型也能被爬出来,让我找到更多喜欢的片子!

    有17位网友表示赞同!

tina

Python 太强大啦!竟然能用来实现这个创意游戏!

    有16位网友表示赞同!

煮酒

这种游戏打破了传统的限制,让人感觉很有新鲜感。

    有9位网友表示赞同!

柠夏初开

如果能加入一些互动环节那就更好了!比如我们能够参与电影推荐或者投票。

    有11位网友表示赞同!

肆忌

我希望能看到更多像这样有趣的游戏创意!

    有12位网友表示赞同!

热点资讯