一.爬虫与反爬斗争—反爬策略
1.通过user-agent客户端标识来判断是不是爬虫
方法:封装请求头:user-agent
2.封ip
方法:设置代理ip
3.通过访问频率判断是否是非人类请求
方法:设置爬取间隔 和爬取策略
4.验证码
方法:识别验证码
5.页面请求不再直接渲染,通过前端js异步获取
方法:a通过selenium+phantomjs来获取数据
b.找到数据来源的接口(ajax接口)
6.能获取列表页,就不获取详情页,为了避免增加请求数量.
a.将详情页放到每条数据中心,第一次爬取先爬取列表
b.第二次从数据库中拿出详情页链接,在做第二次爬取
7.能一次性获取,就不分页获取,正对ajax请求,可以将每一页获取量调高
二.页面技术操作
1.js一种语言
获取页面的元素,可以对这些页面元素进行操作,网络数据的获取
2.jquery
他是一个js库,这个库可以使得js编程变得容易一些
3.ajax
同步和异步请求
三.selenium+phantomjs
如果要解决页面js的问题,主要需要一个工具,这个工具(具备浏览器的功能)可以帮助我们来运行获取到js
1.什么是selenum
selenium是一个web自动化测试工具,但是他本身不具有浏览器功能,相当于一个驱动程序,通过工具可以帮我们自动操作一些具有浏览器功能的外部应用
2.什么是phantomjs
phantomjs是内置的无界面浏览器引擎,他可以像浏览器那样加载页面运行页面中的js代码
chromedriver.exe这个是谷歌浏览器驱动程序,通过这个程序可以使得selenium可以调用chrome浏览器。—有界面浏览器。
这两个的功能有界面的更加强大:很多网站还是可以识别你是不是用phantomjs来进行爬取的,也会被禁。
但是有界面的chrome浏览器是不会被禁的,他就像一个真正用户在请求一样
3.selenium和phantomjs的安装。
(1)下载phantomjs和chromedriver.exe
搜索phanomjs镜像
(2)安装:
解压
找到两个压缩包中exe文件,将其复制到anaconda/Scripts目录下面就ok了。
C:\Anaconda3\Scripts
C:\Anaconda3
(3)测试:
在cmd中输入:phantomjs
chromedriver
(4)selenium安装:pip isntall selenium==2.48.0
四、python的anaconda安装
path路径:里面的路径就是为了在cmd中进行命令输入时候进行exe工具查找。
python的安装最重要的两个工具:
python.exe
pip.exe----最重要
where pip 可以查看哪些路径下面有pip,在配置环境变量的时候,把anaconda的C:\Anaconda3\Scripts方法系统path环境变量最最前面。
五 selenium使用
1.首先要创建驱动(好比打开浏览器)
driver = webdriver.Chorm()
2.通过驱动请求url(浏览器输入网址请求)
driver.get(url)
3.等待程序运行速度非常快 想想我们请求服务器怎么也要加载一些数据 所以等待非常非常重要!!!
a.强制等待 time.sleep(3)
弊端:过于死板,而且有事等待时间可能不够,造成数据缺失,我们无法估计时间
b.隐式等待 driver.implitly_wait(10)
相当于等待页面加载结束最多等待10秒多于10秒如果未加载完全就报超时错误
弊端:等待时间还是太久,我们不需要的数据也需要等待
c.显示等待:可以聚焦到页面特定元素出现即等待结束(方法最好)
使用显示等待步骤
(1),创建等待对象
from seleninum.webdriver.support.waiit import WebDriverWait
wait = WebDriverWait(driver,20)
参数1 等待对象()驱动浏览器)
参数2 等待时间最长20秒 没加载全就报超时错误
(2)用wait对象进行条件判断
定位器
from seleninum.webdriver.support import expected_conditions as EC
EC.presence_of_element_located(定位器)
定位器是一个元祖(用什么定位器:id,xpath,css,‘对应的选择器语法’)
(3)通过定位器等待那一块元素完全加载出来就停止等待
wait.until(EC.EC.presence_of_element_located((By.XPATH,’//div[@id=“root”]’)))
(4)获取页面内容 (用什么语法获取及返回什么内容)
return driver.page_source