多线程爬虫爬取电影天堂资源
来源:互联网 发布:php建站系统 编辑:程序博客网 时间:2024/05/02 13:26
先来简单介绍一下,网络爬虫的基本实现原理吧。一个爬虫首先要给它一个起点,所以需要精心选取一些URL作为起点,然后我们的爬虫从这些起点出发,抓取并解析所抓取到的页面,将所需要的信息提取出来,同时获得的新的URL插入到队列中作为下一次爬取的起点。这样不断地循环,一直到获得你想得到的所有的信息爬虫的任务就算结束了。我们通过一张图片来看一下。
好的 下面进入正题,来讲解下程序的实现。
首先要分析一下电影天堂网站的首页结构。
从上面的菜单栏中我们可以看到整个网站资源的总体分类情况。刚刚好我们可以利用到它的这个分类,将每一个分类地址作为爬虫的起点。
①解析首页地址 提取分类信息
[py] view plaincopy
- #解析首页
- 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树结构才是正确的,要不然在后面解析的时候就会出现问题。
②解析每个分类的主页
[py] view plaincopy
- # 解析分类文件
- 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文件中,但是在命名时不能出现一些特殊符号,所以需要处理掉。二是一定要对分页进行处理,网站中的数据都是通过分页这种形式展示的,所以如何识别并抓取分页也是很重要的。通过观察发现,分页的地址前面没有“/”,所以只需要通过正则表达式找出分页地址链接,然后嵌套调用即可解决分页问题。
③解析资源地址保存到文件中
[py] view plaincopy
- #处理资源页面 爬取资源地址
- 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 "!!!!!!!!!!!!!!!!!"
这段就比较简单了,将提取出来的内容写到一个文件中就行了
为了能够提高程序的运行效率,使用了多线程进行抓取,在这里我是为每一个分类的主页都开辟了一个线程,这样极大地加快了爬虫的效率。想当初,只是用单线程去跑,结果等了一下午最后因为一个异常没处理到结果一下午都白跑了!!!!心累
[py] view plaincopy
- 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上面去下载(点我跳转)
最后爬取的结果如下。
阅读全文
0 0
- 多线程爬虫爬取电影天堂资源
- 爬虫学习(一)---爬取电影天堂下载链接
- 爬取电影天堂的所有资源到mysql
- java实现简单的网络爬虫(爬取电影天堂电影信息)
- scrapy初步-简单静态爬虫(爬取电影天堂所有电影)
- Python爬虫实战(八):爬取电影天堂的电影下载链接
- 正则爬取电影天堂电影信息
- 爬取电影天堂的电影信息
- 爬取电影天堂并存入数据库
- java多线程-爬电影天堂上的电影下载地址
- python爬虫实现下载电影天堂电影
- scrapy实战爬取电影天堂相关信息
- 爬虫小demo爬取豆瓣电影
- 【爬虫】爬取猫眼电影top100
- 使用爬虫爬取豆瓣2016电影榜单中所有电影
- Python—爬虫—简单爬取豆瓣电影
- 用Python爬虫爬取豆瓣TOP250电影
- Python 采用Scrapy爬虫框架爬取豆瓣电影top250
- Scrapy 爬取伯乐在线
- 6CSS3渐变
- linux中与信号量有关的函数
- ACE之Reactor模式使用实例
- 斯坦福机器学习笔记 第1周 一、引言(Introduction)
- 多线程爬虫爬取电影天堂资源
- 网络判断—NetWorkUtil
- 【网站抓取】如何正确识别Baiduspider移动ua
- 实现并行抓取整站40万条房价数据(可更换抓取城市)
- Sentry Robots UVA
- 300. Longest Increasing Subsequence
- ogg格式文件转换为MP3格式
- 抓取妹子图
- 用 construct 2 制作 html 小游戏