一、爬虫和反爬的斗争
1、反爬策略:
⑴通过user-agent客户端标识来判断是不是爬虫。
解决办法:封装请求头 user-agent
⑵封ip
解决办法:设置代理IP
⑶通过访问频率来判断是否是非人类请求
解决办法:设置爬取间隔和爬取策略
⑷验证码
解决办法:识别验证码
⑸页面数据不在直接渲染,通过前端JS异步获取
解决办法:a.通过selenium+phantomJS来获取数据
b.找到数据来源的接口(ajax接口)
2、页面中的技术
(1)JS:是一种语言
获取页面的元素,可以对页面元素进行操作。网络数据的获取。
(2)jQuery:就是一个js库,这个库可以使JS编程变得轻松容易。
(3)ajax:异步请求
二、selenium+phantomjs
1、什么是selenium?
selenium是一个web自动化测试工具。但是它本身不带浏览器的功能,它这个工具就相当于一个驱动程序,通过这个工具可以帮助我们自动操作一些具有浏览器功能的外部应用。
2、什么是phantomjs?
phantomjs就是内置的无界面浏览器引擎。它可以像浏览器那样加载界面,运行页面中的js代码。
chromedriver.exe这个是谷歌浏览器驱动程序,通过这个程序selenium可以调用Chrome浏览器----有界面浏览器
这两个的功能有界面的更加强大:很多网站还是可以识别是否是用phantomjs来进行爬取的,也会被禁。
但有界面的chrome.exe是不会被禁的,它就像一个真正用户在请求一样。
3、selenium和phantomjs的安装
(1)、下载phantomjs和chromedriver.exe
搜索镜像 https://phantomjs.org/download.html
和 https://npm.taobao.org/mirrors/chromedriver
(2)、安装:
解压,找到两个压缩包中的exe文件,将其复制到anaconda/Scripts目录下面。
(3)、测试:
在cmd中输入:phantomjs和chromedriver
(4)、selenium安装:
pip install selenium
三、selenium的简单使用
1、无界面的使用:
#1.导包
from selenium import webdriver
from selenium.webdriver.common.keys import Keys #调用快捷键
# 2. 创建驱动
#driver=webdriver.PhantomJS() #无界面
driver = webdriver.PhantomJS(executable_path=r'D:anacondaScriptsphantomjs.exe')
# 3. 访问网页
driver.get(url='https://www.baidu.com/')
# 4. 方法及属性
# 4.1 title 获取网页的标题
print(driver.title) # 百度一下,你就知道
# 4.2 current_url 获取当前请求的URL
print(driver.current_url) # https://www.baidu.com/
# 4.3 page_source 获取页面内容
print(driver.page_source)
# 4.4 get_cookies() 获取cookie
print(driver.get_cookies())
# 4.5 查找元素
# 4.5.1 根据id查找元素
# find_element_by_id(id值)
kw = driver.find_element_by_id('kw')
print(kw) #WebElement对象
# 4.5.2 根据class查找元素
# find_element_by_class_name(类名) 查找第一个符合类名的元素
# find_elements_by_class_name(类名) 返回列表,查找所有符合类名的元素
s_ipt1 = driver.find_element_by_class_name('s_ipt')
s_ipt2 = driver.find_elements_by_class_name('s_ipt')
print(s_ipt1)print(s_ipt2)
# 4.5.3 根据xpath查找元素
# find_element_by_xpath('路径') 查找到的第一个
# find_elements_by_xpath('路径') 所有查找到的元素
res = driver.find_element_by_xpath('//input[@id="kw"]')
print(res)
#4.5.4 driver.find_element_by_css_selector()#通过css选择器查找
# 4.6 text 获取标签之间的内容
content = driver.find_element_by_id('s-top-left').text
content = driver.find_elements_by_xpath('//div[@id="s-top-left"]/a').text
print(content)
# 4.7 get_attribute('属性名') 获取属性值
content = driver.find_element_by_id('kw').get_attribute('class')
print(content)
# 4.8 save_screenshot() 截图
driver.save_screenshot('baidu.png')
# 4.9 send_keys('输入的内容')
# 步骤:
# 1. 先找到文本框
# 2. 在输入内容
driver.find_element_by_id('kw').send_keys('许嵩')
# 4.10 click() 点击
driver.find_element_by_id('kw').send_keys('许嵩')driver.find_element_by_id('su').click()
# 4.11 支持快捷键
driver.find_element_by_id('kw').send_keys('许嵩')
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'a')
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'x')
#4.12 location 查看元素位置
input_=driver.find_element_by_id('kw')
print(input_.location)
#4.13 size 查看元素大小
print(input_.size)
2、有界面的使用:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options #使用有界面时,可以为其添加配置
# 1.实例化对象
options = Options()
# 2.添加配置
# 例:配置无界面浏览器
# options.add_argument('--headless')
#例: 配置手机UA
# options.add_argument(
# 'user-agent="Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; BLA-AL00 Build/HUAWEIBLA-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/8.9 Mobile Safari/537.36"')
#例: 启动开发者模式
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', 'False')
#配置的添加有很多种,这里只是简单举例
driver = webdriver.Chrome(options=options)
# 访问页面
driver.get(url='https://www.baidu.com')
# 最大化窗口
driver.maximize_window()
# 注:爬虫时最好将窗口最大化再进行数据爬取
# 原因:如果获取的数据在窗口中没有,则可能会获取不到
driver.close() # 关闭选项卡
driver.quit() # 关闭浏览器
除此之外,使用有界面时也可以调用无界面的一些属性以及方法。
四、selenium的反爬处理
有些网站会识别是否是用selenium访问(可以通过window.navigator.webdriver来判断是否使用selenium),从而对其进行反爬,要想顺利进入网站进行数据的爬取,需要在访问网页之前处理selenium的webdriver特征值。
driver.execute_cdp_cmd(
'Page.addScriptToEvaluateOnNewDocument',
{
'source': 'Object.defineProperty(navigator,"webdriver",{get:()=>undefined})'
}
)