爬虫与反爬虫的斗争
爬虫建议
-
尽量减少请求次数
-
保存获取到的HTML,供查错和重复使用
-
-
关注网站的所有类型的页面
-
H5页面
-
APP
-
-
多伪装
-
代理IP
-
import requests proxy = { 'http': '117.114.149.66:55443' # mgvpn https://www.mgvpn10.com/ # ip参考网站 https://www.kuaidaili.com/free/ } response = requests.get("http://httpbin.org/ip",proxies=proxy) print(response.text)
-
随机请求头
# 导入模块 from fake_useragent import UserAgent # 实例化UserAgent ua = UserAgent() headres = { "User-Agent": ua.random # 随机取出一个UserAgent } print(headres)
-
利用多线程分布式
-
在不被发现的情况下我们尽可能的提高速度
-
Ajax基本介绍
动态了解HTML技术
-
JavaScript
-
是网络上最常用的脚本语言,它可以收集用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页
-
-
jQuery
-
jQuery是一个快速、简介的JavaScript框架,封装了JavaScript常用的功能代码
-
-
Ajax 局部刷新 异步加载
-
Ajax可以使用网页实现异步更新,可以在不重新加载整个网页的情况下,对网页的某部分进行更新
-
获取Ajax数据的方式
1.直接分析Ajax调用的接口。然后通过代码请求这个接口。 2.使用Selenium+chromedriver模拟浏览器行为获取数据。
方式 | 优点 | 缺点 |
---|---|---|
分析接口 | 直接可以请求到数据。不需要做一些解析工作。代码量少,性能高 | 分析接口比较复杂,特别是一些通过js混淆的接口,要有一定的js功底。容易被发现是爬虫。 |
selenium | 直接模拟浏览器的行为,浏览器能请求到的,使selenium也能请求到。爬虫更稳定。 | 代码量多。性能低 |
Selenium+chromedriver
selenium介绍
-
selenium是一个web的自动化测试工具,最初是为网站自动化测试而开发的,selenium可以直接运行在浏览器上,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏
-
chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:
-
下载chromedriver
-
百度搜索:淘宝镜像(https://npm.taobao.org/)
-
-
安装
Selenium
:pip install selenium
Selenium快速入门
from selenium import webdriver
# 实例化浏览器
driver = webdriver.Chrome()
# 发送请求
driver.get('https://www.baidu.com')
# 退出浏览器
driver.quit()
driver定位元素
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("https://www.baidu.com") # 1、通过id值定位 driver.find_element(By.ID,"kw").send_keys('马化腾') # 2、通过class值定位 driver.find_element(By.CLASS_NAME,"s_ipt").send_keys('马化腾') # 3、通过name定位 driver.find_element(By.NAME,"wd").send_keys('马化腾') # 4、通过tag_name定位 ipt_tag = driver.find_elements(By.TAG_NAME,"input") print(ipt_tag) # 说明:HTML本质就是由不同的tag(标签)组成,而每个tag都是指同一类,所以tag定位效率低,一般不建议使用; # 5、通过XPATH语法定位 driver.find_element(By.XPATH,'//*[@id="kw"]').send_keys('海贼王') # 6、通过css语法定位 driver.find_element(By.CSS_SELECTOR,"#kw").send_keys('海贼王') # # 7、通过文本定位--精确定位 driver.find_element(By.LINK_TEXT,"新闻").click()
driver操作表单元素
操作输入框:分为两步。 第一步:找到这个元素。 第二步:使用send_keys(value),将数据填充进去
-
使用clear方法可以清除输入框中的内容
inputTag.clear()
-
操作按钮
-
操作按钮有很多种方式。比如单击、右击、双击等。这里讲一个最常用的。就是点击。直接调用click函数就可以了
-
inputTag = driver.find_element(By.ID,'su') inputTag.click()
-
选择select
-
select元素不能直接点击。因为点击后还需要选中元素。这时候selenium就专门为select标签提供了一个类_from _selenium.webdriver.support.ui _import _Select。将获取到的元素当成参数传到这个类中,创建这个对象。以后就可以使用这个对象进行选择了。中国铁路12306网站
-
from selenium import webdriver from selenium.webdriver.support.ui import Select from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() url = 'https://kyfw.12306.cn/otn/regist/init' driver.get(url) ''' iframe 是HTML的一个标签 作用:文档中的文档 如果你要找的标签元素被iframe标签所嵌套,那这个时候你需要切换iframe ''' ''' 总结: 1 先找到要操作的select标签 2 通过Select类 传递参数(你要找到下来菜单的元素) 3 选择方式(根据值来选择 根据索引来选择) ''' # # 定位到select标签 实例化select对象 select_tag = Select(driver.find_element(By.ID,"cardType")) # webelement 将这个element对象传递给select对象 # # 暂停2秒 time.sleep(2) # # 根据属性值定位 # select_tag.select_by_value('C') # # 根据索引定位(从0开始) select_tag.select_by_index(2)
selenium之模拟登录豆瓣
from selenium import webdriver from selenium.webdriver.common.by import By import time # 加载驱动 driver = webdriver.Chrome() # 拿到目标url driver.get("https://www.douban.com/") ''' iframe 是HTML的一个标签 作用:文档中的文档 如果你要找的标签元素被iframe标签所嵌套,那这个时候你需要切换iframe ''' # 切换iframe login_iframe = driver.find_element(By.XPATH,'//*[@id="anony-reg-new"]/div/div[1]/iframe') driver.switch_to.frame(login_iframe) time.sleep(2) # 1 切换登录方式 定位到 密码登录(但是在这一步操作之前 要确实是否要切换iframe) driver.find_element(By.CLASS_NAME,"account-tab-account").click() time.sleep(2) # 2 输入账号和密码 user_input = driver.find_element(By.ID,"username").send_keys("123456789") time.sleep(2) pwd_input = driver.find_element(By.ID,"password").send_keys("123456789") time.sleep(2) # 3 点击登录豆瓣 # 定位登录按钮点击 我们在定位元素的时候 如果属性出现空格的状态 形如:btn btn-account # 解决方式 第一种我们选择属性当中的一部分(需要测试) driver.find_element(By.CLASS_NAME,'btn-account').click() time.sleep(2)