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

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

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

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

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

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

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

以上只是部分代码,全部代码,可以关注本公号,后台回复【电影爬虫】,获取源码。

最后爬取的结果如下。

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

推荐阅读:

用 Python 爬了点你们喜欢的电影相关推荐

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

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

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

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

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

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

  4. python实战(一)Python爬取猫眼评分排行前100电影及简单数据分析可视化python实战(一)Python爬取猫眼排行前一百电影及简单数据分析可视化

    python实战(一)Python爬取猫眼排行前一百电影及简单数据分析可视化 一.抓取数据 需要的库 request库 响应http请求 json库 将文本保存成json形式 pyquery 类似JQ ...

  5. Python爬取豆瓣正在上映的电影

    Python爬取豆瓣正在上映的电影 #爬取豆瓣正在上映的电影 import requests from lxml import etree #1.将目标从网站上的页面抓取下来 headers = {' ...

  6. 使用Python爬取不同类别的豆瓣电影简介

    使用Python爬取不同类别的豆瓣电影简介 之前做过一点文本分类的工作,从豆瓣上爬取了不同类别的数千条电影的简介. 爬取目标 我们爬取的目标是 豆瓣影视,打开豆瓣网,随便点击一部电影,即可看到电影的介 ...

  7. python爬取猫眼正在热映电影

    用python写爬虫爬取需要的数据比较容易,以Python简洁的语法和一大波成熟的库,写起来相当的快 python的版本以及使用的库 Python 3.6.4 requests lxml 这次主要是爬 ...

  8. python 推荐与该用户喜欢的电影类型相同的电影

    假设已有大量用户对若干电影的评分数据,现有某用户,也看过一些电影并进行过评分,要求根据已有打分数据为该用户进行精准推荐.要求尽量推荐与该用户喜欢的电影类型相同的电影(或者说,根据与该用户爱好最相似的用 ...

  9. 用 Python 爬了点你们喜欢的小电影

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

最新文章

  1. 取消对 null 指针“l”的引用。_C++中的引用
  2. 全国计算机等级考试题库二级C操作题100套(第12套)
  3. 计算机学习路线推荐(初稿)
  4. SOAP、WSDL、 UDDI之间的关系
  5. 专访Nick McKeown:网络领域的游戏颠覆者
  6. web网页对话框的一些设置
  7. spring中的web上下文,spring上下文,springmvc上下文区别(超详细)
  8. 基于Transformer的时空融合网络地铁客流预测模型
  9. 论文笔记-Suppress and Balance: A Simple Gated Network for Salient Object Detection
  10. 4-AT命令交互之-COPS选择营运商
  11. ESP-8266接入阿里云开关LED
  12. ros开发增加clion常用模板及初始化配置(二)
  13. 使用Altium Designer10软件绘制芯片引脚图(以IC1114芯片为例)
  14. 上网本不会是一场流星雨
  15. win10系统文件无法复制到u盘怎么办【系统天地】
  16. 设计一款CPU芯片到底有多难?
  17. 展讯6531平台socket
  18. android usb attached,android – USB_DEVICE_ATTACHED意图未触发
  19. 一个女孩主动加你微信,不说话也不打招呼是因为啥呢?
  20. 山东大学软件学院计算机组成原理实验3

热门文章

  1. JavaWeb—静态网页HTML
  2. 英语发音规则---I字母
  3. linux恶意代码检查软件,Yara:恶意软件检测神器
  4. 前端简单入门第十八讲 使用jQuery实现表格的隔行换色
  5. 陌生但默默一统江湖的MurmurHash
  6. 珍惜那些在背后默默为你付出的人
  7. ecshop mysql 30秒_ecshop数据库字段说明汇总
  8. 字典排序什么意思_字典序排序
  9. openwrt/wr703n INode H3C 中山大学校园网 无线路由配置操作
  10. 怀旧服湖畔镇服务器位置,蓝贴:怀旧服合服的服务器!!!