美文网首页Python 开发爬虫python爬虫入门看这个就够了
我的爬虫之路(静态+动态JS加载(selenium + Phan

我的爬虫之路(静态+动态JS加载(selenium + Phan

作者: 韩大熊宝要姓张 | 来源:发表于2016-04-20 18:03 被阅读9925次

    前言:

    (如果你想看动态爬虫请忽略前面的内容吧.前面写给新手的.)
    年前开始学的python,现在也在学习.挺多人问为什么要学python?首先python是一种语言,学什么语言没关系重点是想做什么,开始我就是想做一个小爬虫.仅此而已.我选择学python是因为网上大部分都推荐用python写爬虫而且python的使用比较简单优雅.

    准备:

    1.安装好python环境.(百度廖雪峰的教程,我使用的是python3.5.1 + pycharm)
    2.会点python(废话,不过还是提一下..)
    3.会点正则(这个网上很多资料请自查)
    4.会点XPath(正则能代替不过复杂界面的爬取还是用XPath方便)
    5.会点数据库的东西(当然可以放到txt文档等容器中)

    爬虫1
    先上网页:www.qiushibaike.com(糗事百科,连接不出去,自己访问下吧.)
    打开后是这样的:

    糗事百科.png
    目的很明确我们就想把这个界面上的笑话抓取下来.所以直接来写代码好了. 糗事代码1.png

    好了差不多了,第一个爬虫快完事了.你说什么??这么快?没错是的 请看log 输出的内容:

    糗事2.png

    如果有心那么用浏览器打开上面的网址,点击右键,检查 (我用的chrome,也可以用Firefox 添加一个firebug插件)如下所示:

    网页源代码.png

    和上图对比发现了什么??没错就是这些内容.上面我们的代码打出来的就是网页的源代码!那么我们查找一下源代码中能发现什么呢?

    对比代码.png

    这些内容就在我们的打印内容啊! 所以我们只需要解析打印内容就可以了.(如果你选择复制粘贴,那么现在就开始吧~~~~那么你还学什么爬虫??)

    这时候我们就需要写提取过程了,仔细观察一下这段包含内容的小东西:

    输出内容.png

    我们需要的就是中间的文字而已.这时候就需要正则登场了.简单的说正则就是写一个通用样式来匹配符合的内容.高端的我也不会,如果深入了解可以百度一下.这里希望你懂得一条 (.?). 正则中 . 代表任意字符,匹配任意多个字符, ? 有或者没有. 那么合起来的(.*?) 代表匹配任何长度的字符.(这里看不懂也没关系,暂时就当做是匹配符号就好了)
    好了知道上面的符号我们就写一个正则来表示一下上图中的内容吧

    tr = r'<div class="content">(.*?)<!'

    a.<div class="content">这个表示前面的内容
    b.(.?)代表我们需要的内容
    c.<!代表后面的内容
    d.前面的 r 在python代表的是正则语句,可以省略转义.
    e.(.
    ?)为什么添加一个括号呢? 因为添加一个括号正则匹配返回后是我们括号中的内容.

    有了相应的表达式了那么就开始匹配吧

    chinese = re.findall(tr, html.text, re.S)

    a. tr是正则表达式
    b. html.text 是我们打印的内容
    c. re.S 这个是让正则表达式匹配整体的内容,而不是一行.(这个说明在我下面给的源代码中可以找到)

    保存文件.png

    然后按照上面的方式打开一个文件之后写入.然后就没有然后了..爬虫1完事了.(对新手说的: 这里面的路径是你自己电脑上文件的路径,直接用我这个可能不行!!)

    效果就是这样:


    效果.png

    这其中还有一些字符被抓取下来这个就用字符串处理一下吧!

    爬虫2

    Scrapy 的方式爬取内容 这个框架功能强大,我研究的也不是那么深,我的工程里面有几个demo,如果想要用框架的请去看看视频吧(我是看的麦子学院的视频 Python网络爬虫实战-Scrapy)

    爬虫3

    上面的视频看了吗??? 不重要!!!
    然后可以去看看这个极客学院的视频了.视频
    看完视频了也就会了动态抓取了.

    我看完了上面的视频了,如果你有会员能下载到对应的代码,如果没有没关系我已经写了一遍了在最后给出的网址中.

    感觉已经结束了?错!!!我们开始吧!

    动态抓取的是JS动态加载的数据.我们分析网页源代码是不会出现在其中的数据,可能是点击才会加载.可能是滑动了才会加载等等.

    动态抓取的方式:
    1.分析网页找到对应的数据,找到其中的URL,找到URL的组合方式.然后请求对应的数据之后解析.这种方式可以很快的抓取.不过要注意的是可能会被服务器察觉(可以用scrapy添加代理等等方式来处理.高手都知道~).
    2.使用工具例如Firefox等加载其中然后解析HTML.但是这种方式比较慢因为网页是在加载.这个时间长度相对于上面的方式那就相当于是火箭和牛车.但是更加通用.

    如果你想找第一种方式,那么请看看上面的视频吧.这个就是一步一步的分析的.特别详细.不过我也在想是不是能像静态的 爬虫1那样去抓取想要的数据?查了好久的资料一直是卡住了.通过QQ群还有各种知乎 google.终于知道一种暴力的方式.原理挺简单.就是通过浏览器的加载之后再去解析对应的html.(说的这么容易,我勒个去.服了我自己了.)

    主角登场了 selenium .
    selenium 大牛们都是用来做自动测试的如果感兴趣可以看看这个文档selenium webdriver.你会问问爬虫和这个有什么关系加上了PhantomJS或者是FireFox后就能获取了网页了呀.说白了就是通过这个框架加载一个浏览器然后我们通过获取网页的方式来获取需要的内容.(这两个货都可以用pip来安装.)或者用selenium + Firefox的方式,不过PhantomJS没有界面更快一点,所以建议是调试的时候用Firefox 然后你真的要开始抓取了 就换成 PhantomJS.

    因为上面的极客学院视频中使用的抓取网页是 花千骨的网页. 那么我想必须要弄一个能hold住的电视剧才行.好吧我选择了琅琊榜,琅琊榜第一集

    我们也选取前面视频中对应的 这部分


    琅琊榜中的最新短评.png

    那么就开始写代码吧:

    动态代码1.png

    解释:
    (我代码中写错了单词.diver因为我开始也是复制别人的)
    diver = webdriver.Firefox()
    diver.get('http://v.qq.com/cover/e/e7hi6lep1yc51ca.html?vid=h0018p9ihom') # 腾讯视频琅琊榜
    print(diver.page_source)
    按理说这样我们的浏览器就能够获得对应的代码了, 但是无奈我们需要的地方并不是一下就能看到的.所以我们需要手动把页面拉下来才能加载出来.错! webdriver能代替我们做这件事.这里多说一句就是建议大家看看上面selenium对应的文档.这里面介绍的是对浏览器界面的操作.单击,双击,拖动. 当然也包含了现在需要的页面向下移动(看不懂的去看看文档,或者我的代码中也有注释).

    接着上面直接上代码吧:

    动态代码2.png

    这里面的 js1 js2... 就是用来让界面向下移动的js代码.webdriver可以执行这些代码然后做出相应的动作.这里为了清晰也是一步一步的添加了sleep方法.然后我们查看一下这个时候的源代码:

    对比代码.png 输出查找.png

    然而并没有找到.

    当然如果这里找到了我就不会卡了这么久都不知道为什么.想不出为什么,问了人也是四处无门....让我去哭一下.

    (先说一下:如果在这里你找到了对应的数据了,那么恭喜你不用像我这样迷茫的不知道为什么2个星期前就一直迷茫到现在.可以直接用正则的方式或者是XPath的方式来取出你想要的数据了,如爬虫1 的方式.)

    哭完了.我就想能不能找找相应的文档呢..然后仔细看了看selenium的文档(上面有.)其中有一段看了之后才发现了这个

    文档.png

    抱着试试看的态度我就试了一下.都快跪下了.终于找到你了...(当然文档中的方法可能有点老了.具体的看我代码吧.)

    因为不是太懂html前端相关的东西但是看了下面的对比还是感觉这里面有千丝万缕的联系.右面是文档,左面是网页加载后的代码.

    文档和网页对比.png

    好吧.添加上这一句:

    动态代码.png

    这样再来打印一下 page_source.

    page_source输出.png

    终于找到你!!

    效果.png
    效果2.png

    这里就可以用正则或者是XPath 了..可是就这 几条你能甘心??当然不!!所以我添加了下面的代码:


    拓展-增加评论条数.png

    这样就实现了点击加载更多的操作.也就能加载出更多的评论了..
    好了整理一下基本上实现了目的了.

    总结
    1.动态爬虫的原理.基本上差不多了.爬虫3的方法更加通用.如果要成为高手还是要学习scrapy的相关方法.
    2.每一次抓取不同页面的方法都是不一样的.静态的直接来就行了.动态的要分析一下.这后面的卡住了主要还是基础知识不够.不了解前端.(diver.switch_to.frame('commentIframe1') 这一个太关键了.)
    3.如果有问题,多看看对应框架的文档.多试试 没准就解决了.

    源码爬虫1

    源码:爬虫3

    最后:有问题可以联系我,错别字也算.QQ:645360439

    感谢
    1.我媳妇.因为我只能在她面前炫耀我这拙劣的技术.并且让她不情愿的说一下做爬虫是一件多么牛b的事.
    2.sola,python群里面认识的.貌似还没毕业.将来必将是大神!谢谢传给我的selenium + webdriver 文档.
    3.感谢虫师精准的文档
    4.感谢Daemon1993参考文章

    相关文章

      网友评论

      • 409a2673f2eb:想问下楼主知不知道怎么解决要爬取的内容在网页源码里没有,但在审查元素的Elements有的这种情况,
      • c3f34dcd8215:请教一下,切换到iframe之后怎么打印出里面的内容
        韩大熊宝要姓张:@Don_fisher_efb3 diver.page_source.
      • f0842fb4c986:赞!帮助很大!还有文档,谢谢分享~
        韩大熊宝要姓张:@伊恩陳 相互学习吧
      • 小楼王:qiushibaike的那个,使用soup = BS(r.text, "lxml")
        text_lists = soup.select('div.content > span')
        print text_lists[0].get_text()

        会好不少
      • rainy008:driver = webdriver.phantomJS()
        driver.switch_to_alert().accept()在处理JS原生alert时报错,你遇到这种情况吗
        韩大熊宝要姓张:这个还没有遇到过...:disappointed_relieved:
      • Kalvin_Tse:我最近也为了爬动态的页面头疼的要死,pinterest.com 不像其他的异步加载的页面能很简单的构建出下拉页面的URL,听说PhantomJS可以搞定,正愁没找到合适的教程,看到你写的这篇,望指教!文档什么的能传给我?
        Kalvin_Tse:@韩大熊宝要姓张 谢谢!!有个不情之请,能帮忙看下www.pinterest.com吗?
        韩大熊宝要姓张:@Kalvin_Tse https://pan.baidu.com/s/1jIi5dem 这个是上面提到的文档。原来分享错了。sorry。
        韩大熊宝要姓张:@Kalvin_Tse 前几天没有看评论,还需要吗?需要留留邮箱吧.
      • chenchao981:好几个
        韩大熊宝要姓张:@chenchao981 :joy::joy::joy::joy:啥意思
      • 无与童比:其实不用webdriver 直接用shell命令调用phantomjs 将结果输出为stdout 就行了。这样我个人觉得对单个页面的控制性更强,不过缺点就是js 代码写起来比较恶心。
        无与童比:@韩大熊宝要姓张 我是觉得webdriver 有点不稳定。更加倾向用phantomjs 命令好用一些。
        韩大熊宝要姓张:@无与童比 其实这个就是针对JS代码来说的.我这里面还遇到一个frame的转换问题.,如果直接打印page_source打印结果没有我要的那个数据.
      • brandonxiang:图片的名字改一下吧
        韩大熊宝要姓张:@brandonxiang 好吧.有时间改一下.
        brandonxiang: @韩大熊宝要姓张 我知道,你用markdown嘛,你把图片下面的名字--Paste_Image.png,改一下是每张图的小title
        韩大熊宝要姓张:@brandonxiang 图片是我截的图..

      本文标题:我的爬虫之路(静态+动态JS加载(selenium + Phan

      本文链接:https://www.haomeiwen.com/subject/ragzlttx.html