SIA分享会 第三回 爬虫之selenium

在第一回的分享中,我们已经介绍了利用requests和正则表达式的方法爬取网页上的信息,那为什么这次还要劳神费力地介绍selenium包呐?

01

为什么选择selenium

事实上,我们发现很多信息在网页里看起来唾手可得,但是在获取到的网页源代码中并找不到相关信息。仔细观察网页,我们会发现下拉滑块条会随着下拉的过程逐渐变短,网页会根据用户操作每次返回部分信息。只有真正完成某些操作,我们需要的信息才能够生成,这种网页信息的加载方式就是动态加载。

对于采用动态加载方式的网页,用之前讲到的requests和正则表达式的方法有时会失效,因此我们需要把爬虫改造地更接近人类的操作模式,例如可以点击标签,移动鼠标位置,键入信息等,而selenium包可以很好地帮助我们完成相关操作。

02

selenium基本操作入门

2.1 环境配置

Selenium 下载

pip install selenium

Selenium的webdriver模块当前支持的webdriver有:Firefox,Chrome, IE等

相关下载链接

Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads

Firefox: https://github.com/mozilla/geckodriver/releases

下载后保存到python安装目录中

2.2 selenium初体验

from selenium import webdriver

driver=webdriver.Firefox()

driver.get("http://www.baidu.com")

driver.page_source

运行这段代码,会自动打开火狐浏览器,访问百度,然后打印百度的源代码

2.3 页面交互

我们使用selenium不只是为了打开一个网页,更重要的是获取其中的信息或者实现其他操作,而这一切的前提是查找到我们所需要的元素。

Selenium中提供了丰富的查找元素的方法:

查找一个元素(如果有多个同名标签,返回第一个)

element = driver.find_element_by_id()

element = driver.find_element_by_name()

element = driver.find_element_by_xpath()

element =driver.find_element_by_link_text()

element = driver.find_element_by_tag_name()

一次查找多个元素 :

find_elements_by_name

……

通过xpath查找信息时,可以在Chrome浏览器中选择待目标元素,右键选择检查,从copy中找到xpath,直接获得

获取元素后我们可以实现丰富的操作

键入文本信息:

element.send_keys("中国人民大学")

element.clear() #清除文本信息

element.click()#点击

element.submit() 模拟回车

完成鼠标事件:

#鼠标事件需要先从selenium模块中引入ActionChainsl类

fromselenium.webdriver.common.keys import Keys

#右击

context_click()

#双击

double_click()

#拖动source: 鼠标拖动的源元素,target:鼠标释放的目标元素

drag_and_drop(source,target)

#鼠标悬停

move_to_element()

控制滚条

滚动条并非页面上的元素,这个时候就需要借助js来进行操作。

js="varq=document.documentElement.scrollTop=10000"

driver.execute_script(js)

关闭选项卡关闭页面

driver.quit()

driver.close()

03

小试牛刀——搜索区号对应地区

在根据区号查询地址框中输入区号,输出获得信息

from selenium import webdriver

driver=webdriver.Chrome()

url_ip138='https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%E5%8C%BA%E5%8F%B7&rsv_pq=9da887fc0000df06&rsv_t=edaejLZTsu%2FOg8ShK6Kc4gqidKiTwXRo58zZzQTO0Cclwc9oY%2BIiWOrxneY&rqlang=cn&rsv_enter=1&rsv_sug3=4&rsv_sug1=3&rsv_sug7=100'

driver.get(url_ip138)

element_input=driver.find_element_by_xpath("//*[@id='1']/div[1]/form[2]/div/span/input")

element_input.send_keys("010")

element_click=driver.find_element_by_xpath("//*[@id='1']/div[1]/form[2]/div/a")

element_click.click()

list=driver.window_handles#获取所有窗口的句柄

driver.switch_to.window(list[1])#实现标签页的跳转

infor=driver.find_element_by_xpath("/html/body/center[2]/table[3]/tbody/tr[2]/td")

infor.text

infor_all=driver.find_elements_by_xpath("/html/body/center[2]/table[3]/tbody/tr[*]/td")

for i in infor_all:

print(i.text)

driver.quit()

04

爬取豆瓣电影前十个分类中排名前50的电影名称

难得有空,看什么电影好呢

看看豆瓣分类前五十的推荐吧~

from selenium import webdriver

import time

import pandas as pd

js="varq=document.documentElement.scrollTop=10000000"

all_rank=[]

driver=webdriver.Chrome()

url='https://movie.douban.com/chart'

driver.get(url)

time.sleep(2)

for i in range(1,11):

driver.find_element_by_xpath("//*[@id='content']/div/div[2]/div[1]/div/span[%d]/*"%i).click()

try:

for j in range(0,4):

time.sleep(1.5)

driver.execute_script(js)

except:

print("滚动出错!")

try:

for n in range(1,51):

x=driver.find_element_by_xpath("//*[@id='content']/div/div[1]/div[6]/div[%d]/div/div/div[1]/span[1]/a"%n)

all_rank.append(x.text)

except:

print("获取当前类别第%d个书籍名称出错!"%n)

driver.get(url)

print("已完成对第%d类别的爬取"%i)

time.sleep(1)

inde = ['剧情']*50+['喜剧']*50+['动作']*50+['爱情']*50+['科幻']*50+['动画']*50+['悬疑']*50+['惊悚']*50+['恐怖']*50+['纪录片']*50

rank = pd.Series(all_rank,index=inde)

driver.close()

一部分的运行结果:

05

KatalonRecorder

关注调协公众号:RUCdiaoxie

中国人民大学统计调查协会调查小组

马玥

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180423G1CCX200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券