scrapy+seleinum 新手爬取微博热门话题避坑实录(19/4/12)

总述:

出于某些原因要爬一爬微博的热门话题,我的需求是:热门话题+热门话题下参与讨论的用户的基本信息。

接下来我会介绍三天里面我的工作以及令我印象深刻的坑,因为微博的反爬措施时时刻刻在更新着,所以代码可用度不太高,总而言之一句话:硬刚不了可以绕道而行。

advice1.网站选择

如果你需要获取微博的信息,新手的话最好爬移动端的微博,网址:https://m.weibo.cn/,基本上网页版本有的信息移动端都会有,不过你找不到而已,比如说微博热搜:https://m.weibo.cn/p/index?containerid=106003type%3D25%26t%3D3%26disable_hot%3D1%26filter_type%3Drealtimehot&title=%E5%BE%AE%E5%8D%9A%E7%83%AD%E6%90%9C&extparam=filter_type%3Drealtimehot%26mi_cid%3D100103%26pos%3D0_0%26c_type%3D30%26display_time%3D1555050164&luicode=10000011&lfid=231583

你需要点搜索栏然后右下角有一个热搜榜,这样才可以看到最近的热门话题。

advice2.登录问题

如果你选择移动端的微博网站的话,不登录也是可以爬取的,不过不登录的话有一些信息看不到而已,那我就不在强调登录这一块呢,网上有比较多的解决办法,你可以用自己的账号登录微博之后,然后f12查看一下自己的cook,把它加到代码中就可以了。

advice3.动态网站和静态网站

一开始我就直接用scrapy爬页面,因为之前我爬过几个医疗的网站,也差不多直接scrapy+xpath就爬下来了。新手嘛,果真还是很年轻。网页爬的很顺利,可惜找不到我xpath定位的元素,excese me?然后我输出一下爬下来的源码,emmmm,明明我在网页端可以看到的元素,爬下来全部消失了!!!wocao,明明我做了登录,不知为何就是爬不下来。这让我百思不得七姐(当然八妹也没有得到)。其实这涉及到了一个动态网站和静态网站的差别了,静态网站的所有元素是和网页本身放在一起的,你爬下网页的源代码,所有的元素也就爬取到了。但是动态网页不一样,动态网页的元素是用js加载的,你爬取网页的源代码,源代码是js呀QAQ,他加载的那一部分就不在你爬下来的代码里面呢。怎么解决呢?

安利一下:如何自动获取网页元素的xpath:https://blog.csdn.net/lwgkzl/article/details/89237605

advice4.seleinum初遇

动态网页的爬取我直接用的seleinum,这种上手很快,遵循所见即可爬的原则,不过速度比较慢是真的,幸好我这一次也不需要太多的数据,10w以内吧,所以慢一点也可以。关于seleinum的介绍我就不再说明了(我讲了也不如大佬讲得好),各位看到这句话可能就会要生气了,你不讲我看你作甚?我虽然不讲但是我可以安利大佬的博客给你呀(手动滑稽)

seleinum爬虫必看:https://cuiqingcai.com/5630.html 这里面还有很多其他的爬虫教程,这个可以慢慢学习

advice5.浏览器的选择

使用seleinum的时候,需要有一个模拟的浏览器(这个你不知道,你先看完上面那篇文章再看这个建议),我建议选择firefox,这个模拟起来坑比较少,为啥呢,谷歌浏览器在模拟的时候会弹出这个警示框(这个框这是为难了我好久好久)

 让我欲罢不能,weibo真是太恶心了,弹出这个框之后,seleinum就不能获取到原来网页的元素了,我百度了很久,大家都在齐声高唱如何消除alert的框,各个博客百花齐放,然而千篇一律的讲怎么样消除警示框,都模拟按一个按钮然后弹出一个警示框然后告诉你怎么样消除它,mmp,我现在的问题是我不知道何时出现了警示框ヽ(ー_ー)ノ,然而更气的是,我想到怎么样检测这个警示框之后,他们介绍的方法没一个管用的(小声bb:恕我直言,在座的博客都是垃圾)emmmm然而这一切都不会出现在泥们的身上了,看到这个坑之后,我真心安利firefox浏览器,seleinum模拟火狐的话就不会弹出这个警示框了(虽然也有别的问题)。当然平时用的话感觉还是谷歌好用,当然你强行使用IE的话。。。当我没说什么。

advice6.firefox的坑

这一个可能很少有人遇到吧,火狐浏览器的back方法退到了一个界面的原始界面,也就是说,本来我是在话题榜的:

点进第一个页面,然后爬一些用户的信息,back()之后,有时候会变成了这样:

它变成了热搜榜,也就是这个网址的默认界面。emmmm,这个我是通过检测我需要定位的一类元素长度是0的话,就认为他到热搜榜了,就模拟点击一下重新进入话题榜就行了。

tops = driver.find_elements_by_xpath(
                '//*[@id="app"]/div[1]/div[1]/div/div/div/div/div/div/div/div[2]/div/h3')
        
        if len(tops)==0:
                #模拟进入话题榜

advice7.爬数据的智慧

对于新手而言,往往不是以爬虫为职业的,那么你的目的就是爬到数据,就没必要强攻技术难点了。比如:

我需要爬话题榜下面,每一个发言的用户的用户信息,那么我需要先点击进入某一个话题,然后在点击进入话题下的用户,然后在点击他的主页。需要经过三次点击。如图

 

 

 

 连续进行多次点击我完成这个功能的时候总是会遇到各种bug,这些坑就不一一枚举了。堪比那几天掉下的头发数量。

那么我换过一种思路:我先获取每一个话题下的用户名,然后我不第二轮点击进入用户主页了。我获取用户名之后形成一个列表。然后在微博的搜索界面去搜索这个用户,并且在那个界面点击一次获取这个用户的信息。٩(๑❛ᴗ❛๑)۶虽然我不知道怎么样进行连续多次点击跳转界面,那么我就把它变成多个一次的点击。反正最后数据是爬到了。

 advice8.代理的设置

设置代理在崔大佬的网站中有提及,因为我爬到了近5w个用户的名字,然后大量调用搜索框的话,就会出现“目标计算机积极拒绝你的请求”,这个时候就需要代理了。不过我也没有多少时间,崔大佬介绍了代理池之类的,各位有时间可以去钻研钻研。我上淘宝买了几个代理,然后用一个简单的方法随机使用ip,这个方法特别简单,也很容易懂。首先你得知道如何通过seleinum设置代理:

from selenium import webdriver

proxy = '182.85.206.240:6553'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=http://' + proxy)
chrome = webdriver.Chrome(chrome_options=chrome_options)
chrome.get('http://httpbin.org/get')

这样子的话,就设置了你的ip是182.85.206.240,这个是我买的,你可以买十个,然后设置一个随机数,随机使用就可以了。这个特别简单的就使用了多个代理,不过缺点就是纯seleinum速度会很慢,如果你需要scrapy+seleinum的话,设置代理池比较麻烦。

advice9.安利

崔大佬的博客:https://cuiqingcai.com/5630.html 里面有细致的介绍python的爬虫技术,然后他还有本书,也安利一下

我的代码:https://github.com/lwgkzl/weibo-crawler- 这篇博客主要讲一些坑,代码基本没讲,不过我的代码也很容易使用了,在git上有介绍。

最后:求赞求关注,总算把weibo的数据爬下来了。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值