
我们之前遇到的是使用request + BeautifulSoup组合对静态网页进行请求和数据解析. 如果是JS生成的内容,它还介绍了如何通过查找API借口来获取数据.
但是有时,网页数据是由JS生成的,无法一次又一次找到API借口,或者API借口地址被随机更改,并且时间不等待. 只能使用.
I. 硒简介
硒是用于应用程序的功能工具. 硒就像真正的用户一样直接在其中运行.
由于这种性质,Selenium还是一个功能强大的网络数据收集工具,它使浏览器可以自动加载页面,获取所需数据,甚至获取页面的屏幕截图,或者确定网站上是否执行某些操作发生.
Selenium本身不随浏览器一起提供,需要与第三方浏览器一起使用. 受支持的浏览器是Chrome,Firefox,IE,Phantomjs等.
如果您使用Chrome,FireFox或IE,我们可以看到打开了浏览器窗口,打开了网站,然后执行了代码中的操作.
但是,让程序在后台运行更符合我们的爬虫的气质,因此我主要使用Phantomjs作为浏览器载体,本文还介绍了Phantomjs
Phantomjs是一种“无头”浏览器,即没有接口的浏览器,但是其功能与普通浏览器没有什么不同.
第二,使用Selenium来吸引QQ空间的朋友谈论
Selenium以前是使用pip安装的,您可以直接在代码中导入.
让我们举一个实际的例子-在QQ空间中获取朋友的信息,以简要说明Selenium + Phantomjs的用法.
我们需要像这样抓取页面:

QQ空间朋友谈话链接为: {Friend QQ number} / 311我们掌握了他谈话的时间和内容.
python3运行代码
先输入代码:
#-*-编码: utf-8-*-
从bs4导入BeautifulSoup
从硒导入网络驱动程序
导入时间
##使用Selenium的网络驱动程序实例化浏览器对象,请在此处使用Phantomjs
#driver = webdriver.PhantomJS(executable_path = r“ D: \ phantomjs-2.1.1-windows \ bin \ phantomjs.exe”)
##将Phantomjs窗口设置为最大化
#driver.maximize_window()
#登录QQ空间
def get_shuoshuo(qq):
chromedriver = r“ D: \ soft \ chromedriver_win32 \ chromedriver.exe”
driver = webdriver.Chrome(chromedriver)
#使用get()方法打开要抓取的URL

driver.get('http://user.qzone.qq.com/ {} /311'.format(qq))
time.sleep(5)
#等待5秒钟以确定是否需要登录该页面. 找出该页面是否具有相应的DIV ID.
尝试:
driver.find_element_by_id('login_div')
a =正确
除了:
a = False
如果a ==真:
#如果页面上有登录DIV,请模拟登录
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin'). 点击()
driver.find_element_by_id('u'). clear()#选择用户名框
driver.find_element_by_id('u'). send_keys(“ QQ号码”)
driver.find_element_by_id('p'). 清除()
driver.find_element_by_id('p'). send_keys(“ QQ密码”)
driver.find_element_by_id(“登录按钮”). 点击()
time.sleep(3)
driver.implicitly_wait(3)
#通过确定是否存在元素ID: QM_OwnerInfo_Icon,确定是否在朋友空间中设置了权限
尝试:
driver.find_element_by_id('QM_OwnerInfo_Icon')
b =正确
除了:
b =假
#如果您有权访问对话页面,请找到元素和数据并进行解析.
如果b == True:
driver.switch_to.frame('app_canvas_frame')
content = driver.find_elements_by_css_selector('. content')
stime = driver.find_elements_by_css_selector('. c_tx.c_tx3.goDetail')

对于zip中的con,sti(内容,时间):
数据= {
“时间”: sti.text,
“ shuos”: 上下文文本
}
打印(数据)
pages = driver.page_source
汤= BeautifulSoup(页面,“ lxml”)
#尝试获取cookie,请使用get_cookies()
cookie = driver.get_cookies()
cookie_dict = []
对于cookie中的c:
ck =“ {0} = {1};”. 格式(c ['name'],c ['value'])
cookie_dict.append(ck)
i =''
对于cookie_dict中的c:
i + = c
打印(“ Cookies: ”,“我”)
打印(“ ===========完整===============)
driver.close()
driver.quit()
如果__name__ =='__main __':
get_shuoshuo(“朋友QQ号”)
获取的数据的屏幕截图如下:

三,代码分析
1. 与往常一样,导入所需的模块:
从bs4导入BeautifulSoup
从硒导入网络驱动程序
导入时间
2. 使用Selenium的网络驱动程序实例化浏览器对象,请在此处使用Phantomjs:
driver = webdriver.PhantomJS(executable_path =“ D: \\ phantomjs.exe”)
3. 最大化Phantomjs窗口:
driver.maximize_window()
4. 主要功能部分
使用get()方法打开要抓取的URL:
driver.get('http://user.qzone.qq.com/ {} /311'.format(qq))
等待5秒钟后,确定页面是否需要登录. 确定页面是否具有相应的DIV ID来确定:
尝试:
driver.find_element_by_id('login_div')
a =正确
除了:
a = False
如果页面上有已登录的DIV,请模拟登录:
driver.switch_to.frame('login_frame')#切换到登录ifram
driver.find_element_by_id('switcher_plogin'). 点击()
driver.find_element_by_id('u'). clear()#选择用户名框
driver.find_element_by_id('u'). send_keys(“ QQ号”)
driver.find_element_by_id('p'). clear()#选择密码框
driver.find_element_by_id('p'). send_keys(“ QQ密码”)
driver.find_element_by_id(“登录按钮”). 点击()#点击登录按钮
time.sleep(3)
接下来,确定是否在好友空间中设置了权限,并确定是否存在元素ID: QM_OwnerInfo_Icon
尝试:
driver.find_element_by_id('QM_OwnerInfo_Icon')
b =正确
除了:
b =假
如果您有权访问讨论页面,请找到元素和数据并解析:
如果b == True:

driver.switch_to.frame('app_canvas_frame')
content = driver.find_elements_by_css_selector('. content')
stime = driver.find_elements_by_css_selector('. c_tx.c_tx3.goDetail')
对于zip中的con,sti(内容,时间):
数据= {
#'qq': qq,
“时间”: sti.text,
“ shuos”: 上下文文本
}
打印(数据)
除了在Selenium中解析数据外,我们还可以将当前页面另存为源代码,然后使用BeautifulSoup对其进行解析:
pages = driver.page_source
汤= BeautifulSoup(页面,“ lxml”)
最后好空间 软件,让我们尝试获取cookie,使用get_cookies():
cookie = driver.get_cookies()
cookie_dict = []
对于cookie中的c:
ck =“ {0} = {1};”. 格式(c ['name']好空间 软件,c ['value'])
cookie_dict.append(ck)
i =''
对于cookie_dict中的c:
i + = c
打印(“ Cookies: ”,“我”)
此外,我将介绍两种常见的硒方法:
●保存屏幕截图:
driver.save_screenshot(“保存的文件路径和文件名”)
●执行JS脚本:
driver.execute_script(“ JS代码”)
有关Selenium的更详细的操作和使用,我建议您可以搜索“ Selenium webdriver(python)3rd Edition”这本书.
[优点]填写问卷并发送所选的测试包+接口测试课程!为测试行业做些事!
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-155825-1.html
#吴亦凡#哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥哥
生产这种要多少给多少