爬虫呀!Selenium和chromedriver,页面分析篇

1,027 阅读3分钟

背景

  • selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
  • selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。

目标

  • 爬取某城市房地产销售统计数据(商品房备案,销售信息,价格等)如图

安装扩展

  • 安装Selenium:Selenium有很多语言的版本,有java、ruby、python等。我们下载python版本的就可以了。
pip install selenium
wget https://npm.taobao.org/mirrors/chromedriver/81.0.4044.69/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
cd chromedriver_linux64
mv chromedriver /usr/bin/chromedriver
  • 测试
from selenium import webdriver#导入库
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options) #声明浏览器

url = 'https://www.baidu.com'
driver.get(url)#打开浏览器预设网址
print(driver.page_source)#打印网页源代码
driver.close()#关闭浏览器

页面分析

  • 首页分析页面跳转链接,我们先审查页面元素,如图

  • 有的a标签没有href,每个a标签都有个onclick事件onclick="reurl(this)",我们来看下reurl函数内容,在控制台console.log(reurl)

  • 点击输出内容,查看详细
  • 我们可以清楚的看到reurl函数获取当前a标签的id属性,并且设置href属性,函数没有return,表示不阻止事件冒泡,允许执行a标签默认跳转行为
  • 点击进入分幢信息页面,审查元素
  • 分幢信息是一个表格,表格上面是一个a标签,点击进入楼层详细页面

楼层依然是一个表格,每个td代表一个房间,通过审查元素我们可以看到,每个td有个onclick="s('305188')"事件和一个class="cursor"属性, onclick="s('0')"表示无数据,点击一个有数据查看一下

弹出框就是我们要找的数据

  • 我们来查看弹出框怎么来的,首先还是要看s函数做了些什么

s函数调用了一个nscaler和j函数,继续

nscaler大概的意思就是传入一个数字,转换成另一个值

j函数拿到nscaler函数的值请求了一个ajax

ajax success 又执行了一个n函数

n函数依然是一个ajax,success 执行数据渲染,可以猜测到是弹出框的数据操作

回到控制台看下network的请求

部分数据有乱码,估计是加密了,n函数在显示数据并没其它操作(解密),老方法,审查元素

没错!使用了自定义字体显示,来隐藏真实的数据

爬取

步骤分析

 => 首页(reurl函数设置href,然后跳转) 
     => 列表(a标签直接跳转) 
         => 详细(s函数 ajax请求,显示弹出框)

模拟一波

from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)

# 首页
driver.get('https://newhouse.0557fdc.com/')
sleep(2) # 等待加载完
driver.find_element_by_xpath('//*[@id="2622"]').click() # 模拟点击
print(driver.window_handles) # 输出下浏览器标签页
driver.switch_to.window(driver.window_handles[-1]) #切换到新打开的页面

# 列表
driver.find_element_by_xpath('//*[@id="ContentPlaceHolder1_dlBuildingList"]/tbody/tr[2]/td[1]/div').click() # 模拟点击
print(driver.window_handles) # 输出下浏览器标签页
driver.switch_to.window(driver.window_handles[-1]) # 切换到新打开的页面

# 详细
driver.find_element_by_xpath('//*[@id="ContentPlaceHolder1_HouseTable"]/tbody/tr[3]/td[2]').click()  # 模拟点击
sleep(2)
print(driver.page_source)

picture_url=driver.save_screenshot('.//demo.png') # 切图留念
print("%s :截图成功!!!" % picture_url)

  • 截图

后话

  • 爬虫有风险,获取需谨慎,本文章仅以学习为目的
  • 主要学习使用 Selenium和chromedriver,模拟人的行为爬取页面,比较简单
  • 本次并没有对数据进行筛选,也没有对整个页面批量获取
  • 期待下一篇(批量获取,数据筛选,字体解密,数据入库等)!!!
  • 需要完整例子可加我微信