1:建议
1.1:爬虫的建议
- 1:减少爬虫爬取网站的次数,因为会出现反爬
- 2:在爬取之前,要关注所要爬取网页的类型页面:H5、App
- H5:现在学习爬取的数据就是从H5页面上爬取下来的数据
- 3:使用伪装:使用代理IP、随机请求头
- 4:利用多线程分布式来爬取数据
- 在不被发现的情况下,我们尽可能的提高爬取的速度
- 缺点:报bug的频率会增高、代码复杂
1.2:随机UA
- 需要导入一个第三方的库: fake_UaerAgent
- 随机的ua:
UA = UesrAgent()
- 指定一个确定的浏览器:
Ua = UserAgent()
Ua.chrome
2:selenium背景
2.1:静态网页和动态网页
- 以前我们爬取的都是,静态的网页。静态网页就是说:我们向一个网页发起请求,获得这个网页中的响应数据,获得的响应数据在这个网页的源码中可以找的到。
- 动态网页的请求:网页的数据并不在这个请求的url下面,这些数据而是通过(大多数的方式)Ajax方式加载出来的。
- Ajax:在不更新整个页面的情况下,采用局部更新的方式来获取数据的方法,也就是采用异步更新的方法。
2.2:如何爬取动态网页的数据
- 网页上有我们要爬取的数据,但是网页的源码中没有该数据的解决方法
2.2.1:获取数据的真正接口
- 要分析郑真正的Ajax接口,通过代码来请求这个接口的url,从而获取真正地数据
- 分析数据的接口比较的麻烦,但是代码的编写比较容易
- 一般情况下,在网页的源码中的XHR就是Ajax数据;XHR:Xml Http Request
2.2.2:通过selenium来模拟浏览器获取网页的数据
- 通过selenium来模拟浏览器的行为动作
- 代码比较麻烦,实现起来较为麻烦
3:selenium如何使用
- 1:安装一个驱动:webdriver;注意一定要和自己的浏览器版本一样
- 2:安装一个第三方的库:pip install selenium
4:phantomjs
4.1:Phantomjs介绍
- 俗称无头浏览器;已经过时了
- 称为无头浏览器的原因是应为这个驱动,没有和用户的交互界面,所有的动作用户都看不到
4.2:为什么使用这个技术
- 有的老的程序用的还是这个技术
- 对比这学习chromedriver的区别
4.3:phantomjs快速入门
- 代码
from selenium import webdrive
# 添加驱动,括号里面的是驱动的path,可以把驱动放在python的解释器里面,可以不用写path,一劳永逸,chrome也可以这样。
dirve = webdiver.phantomjs()
4.4:phantomjs常用方法
4.4.1:get()方法
- 代码:
driver.get(url) # 加载一个网站
- 返回结果:加载一个网站
4.4.2:save_screenshot()方法
- 代码:
driver.save_screenshot('截屏图片的名字') # 作用:把当前页面截屏后返回
- 返回结果:当前页面的截屏
4.4.3:find_element_by_id方法
- 定位标签(输入框)
- 代码
a = driver.find_element_by_id('标签名') # 定位id标签
4.4.4:sand.keys()方法
####### 只有input标签可以sand.keys,别的标签会报错。
- 输入数据
- 代码:
a.send.keys('python') # 输入内容
- 返回值:在这个标签里面输入数据
4.4.5:click()方法
- 相当于按个回车键
- 代码:
driver.find_element_by_id('su').click()
- 返回值:相当于按了一下回车键
4.4.6:current_url
- 返回当前的url
- 代码:
driver.current_url
- 返回值:返回当前的url
5:chromedriver(重点)
# 导入模块
from selenium import weddriver
# 添加驱动
driver = webdriver.chrome()
# 加载页面
driver.get('www.xxx.com')
# 关闭窗口或关闭某一个窗口
driver.close()
# 关闭驱动(关闭所有的窗口)
driver.quit()
5.1:chromedriver快速入门
- 在使用chromedriver的时候,要先驱动程序,才可以使用代码
# 添加驱动
driver = webdriver.chrome()
- 返回值:把驱动给添加到pyhon的解释器中
5.1.1:get()方法
- 代码
# 加载页面
driver.get('www.xxx.com')
- 返回值:加载一个窗口
5.1.2:close()
- 代码:
# 关闭窗口或关闭某一个窗口
driver.close()
- 返回值:关闭一个窗口,注意不是这个驱动
5.1.3:quit()方法
- 代码:
# 关闭驱动(关闭所有的窗口)
driver.quit()
- 返回值:关闭驱动,也就是关闭所有的窗口
5.1.4:maxmize_windowe()方法
- 代码:
driver.maxmize_windowe()
- 返回值:把加载出来的页面放到最大
5.2:selenium的前生今世
- selenium不是为爬虫而作出来的,而是前端的一个技术,所以有些技术无法做到
6:定位元素和操作元素
- 注意:webdrivier是一个类
- time.sleep(n)
- 延迟n秒
- find_element:是获取第一个满足条件的元素
- find_element:获取所有所有满足条件的元素
6.1:操作元素
- 代码:
# 导入库
from selenium import webdriver
# 加载驱动
webdriver.chrome()
6.2:定位输入框
6.2.1:通过id定位
方法1
- 代码:
find_element_by_id('标签名')。send.keys('要输入的数据')
- 返回值:在定位的标签中输入要输入的值
方法2
- 需要导入一个方法:
from selenium.webdriver.common.by import By
- 代码:
find_element(By.ID,'id标签名').send_keys('要输入的值')
- 返回值:在定位的标签中输入要输入的值
6.2.2:通过class_name来定位
方法1
- 代码
find_element_by_class_name('要寻找的class_name标签').send.keys('在标签里面输入的内容')
- 返回值:在定位的class_name标签中输入要输入的值
方法2
- 需要导入一个方法:
from selenium.webdriver.common.by import By
- 代码
find_element(BY.CLASS.NAME,‘要寻找的class_name标签’).send.keys('在标签里面输入的内容')
- 返回值:在定位的class_name标签中输入内容
6.2.3:通过name来定位
方法1
- 代码
find_element_by_name('要定位的name标签').send.keys('输入的数据')
- 返回值:在定位的name标签中输入输入输入的数据
方法2
- 需要导入一个方法:
from selenium.webdriver.common.by import By
- 代码
find_element(BY.NAME,'要定位的name标签').send,keys('要输入的数据')
- 返回值:在定位的name标签中输入输入输入的数据
6.2.4:通过标签的名字来定位
- 代码
head = drivrer.find_element_by_tag_name('head')
- 返回值:定位到名字时head的一个标签
6.2.5:通过xpath来定位:
- 使用的条件
- 在没有id、name、class_name的时候使用这个方法
- 代码
driver.find_element_by_xpath('xpath的语法').send.keys('要输入的数据')
- 返回值:找到xpath语法定位的标签,在里面输入输入的数据
6.2.6:定位多的标签
- 代码
driver.find_element_by_tag_name('input')
- 返回值:定位到所有名字为input的标签
7:操作元素
7.1:send.keys()方法
- 代码
driver.find_element_by_xpath('xpath的语法').send.keys('要输入的数据')
- 返回值:输入数据
7.2:clear()
- 代码
inputTag = driver.find_element_by_id('kw')
inputTag.send_keys('红苹果')
time.sleep(2)
inputTag.clear() # 清空内容
- 返回值:清空内容
7.3:click()
- 代码
button = driver.find_element_by_id('su')
button.click()
- 返回值:点击一下,相当于回车
8:操作select标签
- select:下拉框的意思
- 方法:先定位这个下拉框的位置在操作
- select标签:不能直接点击,因为点击之后还要选中其中的元素
- 需要导入一个库:from selenium.webdriver.support.ui import Select
8.1:定位方法
8.1.1:根据值来定位
- 代码:
selectTag.select_by_value('JP')
- 返回值:点击这个的标签
8.1.2:根据索引来定位
- 代码
selectTag.select_by_index(2)
- 返回值:返回下拉框当中的第二个元素,元素的顺序是从0开始的
8.3:切换iframe标签
- iframe:是Html的一种标签,文档中的文档
- 使用时机:如果有iframe标签,而这个标签中刚好有我们需要的数据的时候,就需要先切换把定位切换到这个ifrme之下。
- 代码:
# 死代码,只要记住就行了
driver.switch_to_frame(driver.find_element_by_id('iframe') # 过时的方法
driver.switch_to.frame(driver.find_element_by_id('iframe')) # 新的方法
8.4:操作非select标签的下拉框
- 注意:导入的select方法只能工作在select标签下的标签,所以对于不是select标签来使用select方法会报错
8.4.1:解决方法
- 1:先找到这个iframe的下拉框
- 2:点击展开
- 3:点击自己需要的点击一下