js 抓取网页内容(网页数据由JS生成,API借口地址随机变换,时间不等人)
优采云 发布时间: 2021-09-13 03:00js 抓取网页内容(网页数据由JS生成,API借口地址随机变换,时间不等人)
我们之前遇到的都是使用requests+BeautifulSoup的组合来请求和分析静态网页。如果是JS生成的内容,还介绍了如何找API借口获取数据。
但是有时候网页数据是JS生成的,找不到API借口活着或者API借口地址随机变化,时间不等人。那你就只能用Selenium了。
一、Selenium 介绍
Selenium 是一种用于 Web 应用程序的功能自动化测试工具。 Selenium 直接在浏览器中运行,就像真实用户在操作一样。
正因如此,Selenium也是采集网络数据的强大工具,它可以让浏览器自动加载页面,获取需要的数据,甚至是页面的截图,或者判断采集上的某些操作网站已经发生。
Selenium 没有浏览器,需要配合第三方浏览器使用。支持的浏览器有Chrome、Firefox、IE、Phantomjs等
如果我们使用Chrome、FireFox或IE,可以看到打开了一个浏览器窗口,打开@网站,然后执行代码中的操作。
不过,让程序在后台运行更符合我们的爬虫气质,所以我使用Phantomjs作为浏览器的载体。本文文章也介绍了Phantomjs
Phantomjs 是一个“无头”浏览器,即没有界面的浏览器,但它的功能与普通浏览器没有区别。
二、Python 中使用 Selenium 得到 空间的朋友们的讨论
之前用pip安装selenium,直接在代码中导入即可。
举个实际的例子——获取一个QQ空间好友的聊天信息,简单说明Selenium+Phantomjs的使用。
当我们需要爬取的页面是这样的:
QQ空间好友谈论的链接是:{好友QQ号}/311
我们抓住他说的话的时间和内容。
还是先上传代码:
from bs4 import BeautifulSoup
from selenium import webdriver
import time
#使用selenium
driver = webdriver.PhantomJS(executable_path="D:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe")
driver.maximize_window()
#登录QQ空间
def get_shuoshuo(qq):
driver.get('http://user.qzone.qq.com/{}/311'.format(qq))
time.sleep(5)
try:
driver.find_element_by_id('login_div')
a = True
except:
a = False
if a == True:
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()
driver.find_element_by_id('u').clear()#选择用户名框
driver.find_element_by_id('u').send_keys('641010605')
driver.find_element_by_id('p').clear()
driver.find_element_by_id('p').send_keys('zy060726')
driver.find_element_by_id('login_button').click()
time.sleep(3)
driver.implicitly_wait(3)
try:
driver.find_element_by_id('QM_OwnerInfo_Icon')
b = True
except:
b = False
if 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')
for con,sti in zip(content,stime):
data = {
'time':sti.text,
'shuos':con.text
}
print(data)
pages = driver.page_source
soup = BeautifulSoup(pages,'lxml')
cookie = driver.get_cookies()
cookie_dict = []
for c in cookie:
ck = "{0}={1};".format(c['name'],c['value'])
cookie_dict.append(ck)
i = ''
for c in cookie_dict:
i += c
print('Cookies:',i)
print("==========完成================")
driver.close()
driver.quit()
if __name__ == '__main__':
get_shuoshuo('641010605')
获取到的数据截图如下:
接下来讲解代码,稍微了解一下Selenium的使用
三、代码简析
1.像往常一样,导入需要的模块:
from bs4 import BeautifulSoup
from selenium import webdriver
import time
2. 使用 Selenium 的 webdriver 实例化一个浏览器对象,这里使用 Phantomjs:
driver = webdriver.PhantomJS(executable_path="D:\\phantomjs.exe")
3.设置 Phantomjs 窗口最大化:
driver.maximize_window()
4.Main 函数部分
使用get()方法打开要爬取的网址:
driver.get('http://user.qzone.qq.com/{}/311'.format(qq))
等待5秒后,判断页面是否需要登录,判断页面是否有对应的DIV id:
try:
driver.find_element_by_id('login_div')
a = True
except:
a = False
如果页面有登录DIV,模拟登录:
driver.switch_to.frame('login_frame') #切换到登录ifram
driver.find_element_by_id('switcher_plogin').click()
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('login_button').click()#点击登录按钮
time.sleep(3)
接下来判断好友空间是否设置有权限,通过判断是否有元素ID:QM_OwnerInfo_Icon
try:
driver.find_element_by_id('QM_OwnerInfo_Icon')
b = True
except:
b = False
如果你有访问讨论页的权限,定位元素和数据,并解析它们:
if 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')
for con,sti in zip(content,stime):
data = {
# 'qq':qq,
'time':sti.text,
'shuos':con.text
}
print(data)
除了在Selenium中解析数据,我们还可以将当前页面保存为源代码,使用BeautifulSoup来解析:
pages = driver.page_source
soup = BeautifulSoup(pages,'lxml')
最后,让我们尝试使用 get_cookies() 获取 cookie:
cookie = driver.get_cookies()
cookie_dict = []
for c in cookie:
ck = "{0}={1};".format(c['name'],c['value'])
cookie_dict.append(ck)
i = ''
for c in cookie_dict:
i += c
print('Cookies:',i)
另外,我将介绍Selenium的两种常用方法:
保存截图:
driver.save_screenshot('保存的文件路径及文件名')
执行JS脚本:
driver.execute_script("JS代码")
关于Selenium更详细的操作和使用,推荐一本书《selenium webdriver(python)第三版》,网上可以搜索;