在第一回的分享中,我们已经介绍了利用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
中国人民大学统计调查协会调查小组
马玥
领取专属 10元无门槛券
私享最新 技术干货