整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

使用Selenium实现微博爬虫:预登录、展开全文、翻页

想实现爬微博的自由吗?这里可以实现了!本文可以解决微博预登录、识别“展开全文”并爬取完整数据、翻页设置等问题。

一、区分动态爬虫和静态爬虫

1、静态网页

静态网页是纯粹的HTML,没有后台数据库,不含程序,不可交互,体量较少,加载速度快。静态网页的爬取只需四个步骤:发送请求、获取相应内容、解析内容及保存数据。

2、动态网页

动态网页上的数据会随时间及用户交互发生变化,因此数据不会直接呈现在网页源代码中,数据将以Json的形式保存起来。因此,动态网页比静态网页多了一步,即需渲染获得相关数据。

3、区分动静态网页的方法

加载网页后,点击右键,选中“查看网页源代码”,如果网页上的绝大多数字段都出现源代码中,那么这就是静态网页,否则是动态网页。

二、动态爬虫的两种方法

1.逆向分析爬取动态网页

适用于调度资源所对应网址的数据为json格式,Javascript的触发调度。主要步骤是获取需要调度资源所对应的网址-访问网址获得该资源的数据。(此处不详细讲解)


2.使用Selenium库爬取动态网页

使用Selenium库,该库使用JavaScript模拟真实用户对浏览器进行操作。本案例将使用该方法。

三、安装Selenium库及下载浏览器补丁

1.Selenium库使用pip工具进行安装即可。

2.下载与Chrome浏览器版本匹配的浏览器补丁。

Step1:查看Chrome的版本

Step2:去下载相应版本的浏览器补丁。网址:http://npm.taobao.org/mirrors/chromedriver/

Step3:解压文件,并将之放到与python.exe同一文件下

四、页面打开及预登录

1.导入selenium包

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
import time
import pandas as pd

2.打开页面

driver = webdriver.Chrome()
print('准备登陆Weibo.cn网站...')
#发送请求
driver.get("https://login.sina.com.cn/signup/signin.php")
wait = WebDriverWait(driver,5)
#重要:暂停1分钟进行预登陆,此处填写账号密码及验证
time.sleep(60)


3.采用交互式运行,运行完上面两段程序,会弹出一个框,这个框就是用来模拟网页的交互。在这个框中完成登录(包括填写登录名、密码及短信验证等)

4.完成预登录,则进入个人主页

五、关键词搜索操作

1.定位上图中的关键词输入框,并在框中输入搜索对象,如“努力学习”

#使用selector去定位关键词搜索框
s_input = driver.find_element_by_css_selector('#search_input')
#向搜索框中传入字段
s_input.send_keys("努力学习")
#定位搜索键
confirm_btn = driver.find_element_by_css_selector('#search_submit')
#点击
confirm_btn.click()

2.当完成上步的代码运行后,会弹出新的窗口,从个人主页跳到微博搜索页。但是driver仍在个人主页,需要人为进行driver的移动,将之移动到微博搜索页。

3.使用switch_to.window()方法移位

#人为移动driver
driver.switch_to.window(driver.window_handles[1])

六、识别“展开全文”并爬取数据

1.了解每个元素的Selector,用以定位(重点在于唯一标识性)

2.使用Selector定位元素,并获取相应的数据

comment = []
username = []

#抓取节点:每个评论为一个节点(包括用户信息、评论、日期等信息),如果一页有20条评论,那么nodes的长度就为20
nodes = driver.find_elements_by_css_selector('div.card > div.card-feed > div.content')

#对每个节点进行循环操作
for i in range(0,len(nodes),1):
    #判断每个节点是否有“展开全文”的链接
    flag = False
    try:
        nodes[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").is_displayed()
        flag = True
    except:
        flag = False

    #如果该节点具有“展开全文”的链接,且该链接中的文字是“展开全文c”,那么点击这个要素,并获取指定位置的文本;否则直接获取文本
    #(两个条件需要同时满足,因为该selector不仅标识了展开全文,还标识了其他元素,没有做到唯一定位)
    if(flag and nodes[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").text.startswith('展开全文c')):
        nodes[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").click()
        comment.append(nodes[i].find_element_by_css_selector('p[node-type="feed_list_content_full"]').text)
    else:
        comment.append(nodes[i].find_element_by_css_selector('p[node-type="feed_list_content"]').text)
    username.append(nodes[i].find_element_by_css_selector("div.info>div:nth-child(2)>a").text)

七、设置翻页

1.使用for循环实现翻页,重点在于识别“下一页”按钮,并点击它

for page in range(49):
    print(page)
    # 定位下一页按钮
    nextpage_button = driver.find_element_by_link_text('下一页')
    #点击按键
    driver.execute_script("arguments[0].click();", nextpage_button)
    wait = WebDriverWait(driver,5)
    #与前面类似
    nodes1 = driver.find_elements_by_css_selector('div.card > div.card-feed > div.content')
    for i in range(0,len(nodes1),1):
        flag = False
        try:
            nodes1[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").is_displayed()
            flag = True

        except:
            flag = False
        if (flag and nodes1[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").text.startswith('展开全文c')):
            nodes1[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").click()
            comment.append(nodes1[i].find_element_by_css_selector('p[node-type="feed_list_content_full"]').text)
        else:
            comment.append(nodes1[i].find_element_by_css_selector('p[node-type="feed_list_content"]').text)
        username.append(nodes1[i].find_element_by_css_selector("div.info>div:nth-child(2)>a").text)

八、保存数据

1.使用DataFrame保存字段

data = pd.DataFrame({'username':username,'comment':comment})

2.导出到Excel

data.to_excel("weibo.xlsx")

九、完整代码

<script src="https://lf6-cdn-tos.bytescm.com/obj/cdn-static-resource/tt_player/tt.player.js?v=20160723"></script>

CSS视频教程第21课 超实用的翻页


在CSS3中新增了很多的新特性,其中使用频率比较高的应该是动画效果了,它可以帮助我们实现以前使用Javascript才能实现的效果,极大的提高网页的性能。今天这篇文章我们就来一起看一个使用CSS3新特性完成的翻书效果吧。

本文的源码已经放在了Github上,感兴趣的可以clone到本地试试,地址如下。

https://github.com/zhouxiongking/article-pages/blob/master/articles/rollPage/rollPage.html

CSS3

实现效果

首先我们来看看实际的运行效果,动态图如下所示。

效果图

页面分析

在看到上述的效果图后,我们来进行分析,这个过程是如何实现的。

这个页面我们通过一个ul包含三个li来实现,每个li都给一个固定的宽度和高度。

  • 第一个li在页面上静止不动。

  • 第二个li添加动画效果,使其直接绕Y轴翻转360度。

  • 第三个li添加动画效果,但是翻转周期是在25%的时候开始,因此会有一种翻书的速度差异感。

上面的步骤分析完后就剩下最重要的一个过程,那就是给外层的ul元素添加perspective属性,这个属性是决定这个动画能不能实现的主要的因素。

perspective

perspective是CSS3中新增的属性,表示的是设置某个元素被查看的视角,用于实现3D效果。

需要注意的是当某个元素设置了perspective属性时,其子元素会获得透视效果,而不是这个元素本身。

我们来看一个简单的例子,有一个section父元素和一个div子元素,让div元素旋转45度,html元素如下。

html元素

其对应的CSS属性如下。

CSS属性

在section元素上,如果不使用perspective的情况下,得到效果如下图所示。

效果图1

如果给section元素加上perspective属性,并设定600px时,得到的效果图如下。

效果图

通过以上两幅图的对比我们发现,两幅图在Y轴的视角上发生了变化。

接下来,我们来具体看看这个翻书效果的代码实现。

翻书效果HTML代码

通过之前的分析,我们知道这个效果是通过ul与li来实现的,html部分代码如下。

HTML代码

翻书效果CSS代码

首先看看ul与li的基本css属性,记住这里需要给ul元素添加perspective属性。

基本CSS属性

然后是给第二个li添加动画。

第二个li的css属性

最后是给第三个li添加动画。

第三个li的css属性

注意到上面的代码中有个25%和100%的设置,这个和第二个li不同,所以会有一种翻转书页快慢的差异感。

如果按照上述代码来做,即可实现文章开始的翻书动画效果。

结束语

今天这篇文章主要是通过CSS3新增的属性实现了一个翻书动画效果,大家学会了吗?