python scrapy框架 +selenium 爬取github中的变化部分的内容的坑

      最近3个星期做了一个有关爬虫的项目,本来以为一个星期就可以搞定的结果没想到居然整了三个星期,其中各种坑!!!内容可能很多,也很碎,写这篇文章的主要目的是为了给自己梳理一下通过解决这些坑所学到的知识,也希望给大家带来帮助!

     首先,总结一下写爬虫的思路。主要有以下三点:

     1.爬取完整的网页(用到了scrapy+selenium)

      2.提取网页的中你想要的相关数据(用到bs4或者是xpath)

      3.对提取的数据进行组合和存储(用到了json和text)

     接下来我将展开所有的内容进行梳理!

一·爬取完整的网页

     1.首先要注意的是自己看到的网页和你用scrapy爬取出来的可能不一样啊!!!!这个坑把我坑了三天,而且直接导致我对Xpath的错误理解!不过亡羊补牢,让我学会了bs4!

 话不多说上图。图一:

图二:

大家请看图一和图二是相同的 一段代码。但是他们的网页的代码是不同的。知道为什么吗?是因为图一是登录状态下的图,图二是没有登录github账号的图。大家仔细观察可以看到第一个图比第二个图多了一个蓝色的加号!下面是登录状态下的网页代码

图四是非登陆状态下的网页代码。

大家可以看图三和图四中红圈的部分,可以看到图三比图四多了一个button标签。

  说完了这个问题接着说一下解决办法吧!办法就是在scrapy中利用cookie模拟登陆。这里最重要的是提取cookie的代码可以看我的github:https://github.com/FrankUSA2015/Extract-github-log-in-cookie,当提取完cookie后就可以利用selenium添加上cookie进行爬虫了。具体添加cookie的方法请自行搜索!

     接下来要讲一下github commit的网页的特征,首先commit网页有js的一些特效,所以建议大家一定要用selenium进行加载url这样就会的到你从浏览器中看到的效果!我用selenium是配上chromedriver用的,建议大家也使用这个,因为比较普遍,而且也很方便。因为commit页面是有js特效的,所有我们用chrome按F12看到的和scrapy爬取下来的网页是不一样的,要想在浏览器上看到和scrapy爬取的一样格式的代码,你需要加在你要查看的界面上点击鼠标右键找到“查看网页源代码”这一项。这样会弹出一个新的页面见下图:

下一个坑是如果commit内容比较多它不会在第一次加载中把数据全部加载出来,他会需要你下拉网页,这样才能把数据完全加载出来。你需要用selenium模拟一个下拉的动作代码如下:

from selenium import webdriver#这里是插入这个模块
bro = webdriver.Chrome()
js = "var q=document.documentElement.scrollTop=100000"
bro.execute_script(js)
time.sleep(10)#这里是指完成下拉时,程序等待10秒在执行,因为要等待数据的传输,如果没有等待直接执行下一步操作时,也就没有意义了

          下一个坑还是跟commit内容多有关,当commit内容多时,它会出现这样的情况,如下图所示:

在这里出现了不是代码而是load diff ,这个时候需要你点击“Load diff”才能出现代码。所以你在写爬虫时要模拟点击“Load diff”才能出现你想要的这个部分的代码。

二·提取网页中你想要的信息:

        经过上一步的操作,我们终于可以爬取出完整的网页源代码。接下来我们就可与用bs4或者xpath来提取想要的内容了。接下来说一下bs4中的坑。首先说一下select.

      select是一个CSS选择器,他的规则和css相同,他返回的是一个列表,如果列表不是空,则里面的元素是<class 'bs4.element.Tag'>的类型。选择某个标签的css的规则可以直接用chrome自带的提示工具来选取!具体是按F12查看源代码,然后找到你要查找的标签,右键点击Copy---->copy selector 就可以得到你要查找的标签的css规则了。是不是超级超级的方便!!!!

    一般的情况下bs4用的的功能就那么几种:

1.基本的节点的用法,包括节点的名称,属性,节点中的文字信息。

2.节点的直接父节点parent

3.一个节点中如果还包括孩子节点,如果想把这些孩子节点的文本的值就可以用text或者get_text()获取,而且他们的返回类型都是String类型。

4.find()方法。它返回的是第一个满足条件的节点

5.find_all()方法。它返回的是所有的满足条件的节点,它返回的是列表类型。在这里与select相似。

注:当查找出现问题时,可以从两个方面找原因:(1)是看看爬取的网页是否完整,是否和自己从浏览器上看到的一样。(2)看看查询结果返回的是什么类型,如果是bs4.element.Tag类型那么说明这个结果还可以进一步的查找,如果是list类型,那么就需要把里面的每个元素提取出来。如果以上两点都没有问题,那问题就出在了查找的规则上,即css规则

三·对提取的数据进行组合和存储

     这一部分一般就是数据存储到数据库或者是json或者是txt中。这一部分一般的情况是没有什么问题的。

补充一下去,影响爬虫的还有一个至关重要的因素,那就是网速!可能因为网速的事情导致一些js加载的数据没有加载出来!!! 

以上就是我写爬虫的心得,希望给一些像我一样初学的小白提供帮助,少走弯路

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值