python+selenium 爬取微博(网页版)并解决账号密码登录、短信验证

前言

为什么爬网页版微博

网页端的微博比移动端的难爬一点,但是来网页端是因为这里可以使用高级搜索功能,它不同于普通搜索的是它可以选定发布时间和发布地点,把博文和这些爬下来可以用来做更多更全面的数据分析。

为什么使用selenium

去微博搜索某个关键词,会发现第一页的内容下拉到底后,微博会提示登录才能看到之后的页面的内容,点击登录之后它就会分页显示,最多显示到50页。
我一开始想着,那我只要分析微博的网址构造,然后用requests去打开后面页数的网址不就可以了?比如去用高级搜索功能搜索:
在这里插入图片描述
https://s.weibo.com/weibo/%25E6%2596%25B0%25E8%2583%25BD%25E6%25BA%2590%25E6%25B1%25BD%25E8%25BD%25A6%25E6%2594%25BF%25E7%25AD%2596?q=%E6%96%B0%E8%83%BD%E6%BA%90&region=custom:44:1000&typeall=1&suball=1&timescope=custom:2020-12-08:2020-12-16&Refer=g
这是上图的搜索结果的网址,不难发现:
q后面的是关键词(经过二次编码后变成了一长串的东西);
region=custom:XX:1000,这里的XX是省份的代码;
typeall=1&suball=1 ,这两是“类型”和“包含”选项;
timescope=custom:2020-12-08:2020-12-16就是时间段。

登录后查看第二页的网址:
https://s.weibo.com/weibo/%25E6%2596%25B0%25E8%2583%25BD%25E6%25BA%2590%25E6%25B1%25BD%25E8%25BD%25A6%25E6%2594%25BF%25E7%25AD%2596?q=%E6%96%B0%E8%83%BD%E6%BA%90&region=custom:44:1000&typeall=1&suball=1&timescope=custom:2020-12-08:2020-12-16&Refer=g&page=2
其他都相同,就最后多了个&page=2。然后看第三页也是&page=3。再然后再第一页的最后面页加个&page=1,也能正常打开。
至此,我们就找到了网址的构造规律了。

接下来,设置变量分别代表:搜索关键词、省份对应的数字(这个得自己打开微博一个个去试)、起始年、起始月、起始日、终点年、终点月、终点日、页码。
然后通过改变变量就可以访问所有相应的网页了。
(ps:因为怕50页显示不了太多,这里起始终止的年和月变量我就用同一个了)

index="小姐姐"
sheng=34
year=2020
month=1
day1=1
day2=30
page=1

url = "https://s.weibo.com/weibo?q={}&region=custom:{}:1000&typeall=1&suball=1&timescope=custom:{}-{}-{}:{}-{}-{}&Refer=g&page={}".format(index, sheng, year, month, day1, year, month, day2, page)

但是问题来了,发现爬虫只能爬下第一页的数据,第二页开始的都爬不了,为什么呢?这时你退出登录,然后再复制上面的第二页的网址去打开,你就发现打开不了,跳到了登录页面,微博还是要你登录才能访问之后的内容。
哦,所以现在我们需要去模拟微博登录。

怎么模拟微博登录

用selenium模拟浏览器操作。
网上的方法大多推荐用http请求、获取cookie这些,但说实话这些对新手不太友好。
selenium可能存在有一些缺点,但它也有它的优点,selenium做爬虫的好处就是简单直接(只需要知道简单的HTML和xpath的知识就够了),而且可以通过浏览器直接看到爬取的过程,出现错误很容易发现(这不比看pycharm下面一大串的报错信息强?)。
怎么操作详情往下看。

一、事前准备

谷歌浏览器、python3.7、pycharm(这些就先自己安装吧,这里就不给教程了)

二、Selenium安装

关于selenium

selenium是一个用于Web应用程序测试的工具,selenium测试直接运行再浏览器上,就像真正的用户在操作一样。(百度百科)
简单来说,selenium就是用来模拟用户操作浏览器。

安装步骤

  1. win+r,输入cmd,输入pip install selenium
  2. 下载ChromeDriver。
    找到对应的浏览器、版本下载。
    怎么查看谷歌浏览器的版本:打开谷歌浏览器,关闭按钮下面的三个点》帮助》关于Google Chrome,可以看到自己的版本。记下那串数字(比如我的是版本 87.0.4280.88)然后去下面的驱动下载网址找对应的就行。

Chrome驱动下载地址:http://npm.taobao.org/mirrors/chromedriver/

查看浏览器版本
找到对应版本点进去
windows系统(不管你是32还是64位)就是这个win32的。
在这里插入图片描述

  1. 下载完成后,需要做两件事:
    (1).将驱动放复制到浏览器根目录下;
    找到谷歌浏览器快捷方式,右键,打开文件位置,把下载的文件夹里面的那个东西粘贴进来(注意不能直接把下载的文件夹放进来,要放里面的chromedriver,下面的第二步也一样)
    在这里插入图片描述
    (2).将驱动复制到Python根目录下。
    可以打开pycharm,左边Project里面可以看到你的项目的路径,放那就行。
    在这里插入图片描述

  2. 测试环境是否搭建成功

from selenium import webdriver

browser = webdriver.Chrome()
browser.set_window_size(1000,800)
browser.get('https://www.baidu.com/')

运行后可以看到新开一个浏览器窗口并在几秒内打开了百度

三、selenium定位网页元素

先学一下selenium的基本操作吧。(可以先简单看看)

基本方法

定位的方法有很多,这里主要用以下两种方式:

find_element_by_id 使用id定位元素
find_element_by_xpath 使用xpath定位元素

以上方法可以定位到网页的第一个符合该定位条件的元素,但我们写爬虫有时候需要定位这类的所有元素(比如爬取当前页面所以微博的文本内容),所以需要用下面的find_elements方法(加个s就行)。具体加不加s根据实际情况决定。

find_elements_by_id 使用id定位所有元素
find_elements_by_xpath 使用xpath定位所有元素

插一下我的启蒙教程:(up猪打钱!)
(1)https://www.bilibili.com/video/BV1Jx411Z7mX
(2)https://www.bilibili.com/video/BV1px411d7XY
观看建议:
上面的(1)是关于“Selenium安装及使用”,(2)是“登录效果实现”。
建议开1.5倍速看,里面还会介绍一下原理性的东西和一些废话,不喜欢的可以快进直到正式内容。
如果没看懂我上面的selenium安装和使用的可以去这里看看。
时间是第一个视频的第3分钟开始到第二个视频的第28分钟。

详细使用

from selenium import webdriver

browser = webdriver.Chrome()
browser.set_window_size
  • 23
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值