写爬虫代码
- 尽量减少请求次数
- 1.能找列表页就不抓详情页
- 2.保存获取到的html页面,供差错和重复请求使用
- 关注网站的所有类型的页面
- 1.wap页面,触屏版页面
- 2.H5页面
- 3.APP
- 多伪装
- 1.动态的UA
- 2.代理ip
- 3.不使用cookie
- 利用多线程分布式
- 在不被ban的请求下尽可能的提高速度
selenium使用
-
导入
from selenium import webdriver -
实例化浏览器
- driver = webdriver.Chrome()
-
设置窗口大小
- driver.set_window_size(1920,1080)
- driver.maximize_window() ## 最大化窗口
-
发送请求
- driver.get()
-
页面截屏
- driver.save_screenshot(路径)
-
获取cookies
- driver.get_cookies()
-
关闭浏览器/页面
- driver.quit() - 关闭浏览器
- driver.close() - 关闭当前页面
-
元素定位
- driver.find_element_by_id()
- 根据id找到元素或内容
- driver.find_element_by_class_name()
- 根据classname找到元素或内容
- driver.find_elements_by_xpath()
- 根据xpath获取元素,elements是列表
- (element).text
- 获取文本element元素的
- driver.find_element_by_id()
-
获取元素属性
- 定位元素.get_attribute(属性名)
-
没有获取到定位的属性的时候使用下面的定位方式会报错
- element_by_x
-
使用elements_by_x :则不会报错
-
定位链接,获取完整的url
- find_element_by_link_text(链接文本)
- find_element_by_partial_link_text(链接的部分文本)
selenium使用注意点
-
获取文本和获取属性
- 先定位到元素,然后调用
.text
或者get_attribute
方法来获取
- 先定位到元素,然后调用
-
selenium 获取到的数据elements的内容
-
find_element和find_elements的区别
- find_element:返回一个element,如果没有会报错
- find_elements:返回一个列表,没有就是一个空列表
- 在判断是否有下一页的时候,使用find_elements来根据结果的列表长度来判断
-
如果页面中含有iframe、frame,需要先调用driver.switch_to.frame的方法切换到frame中才能定位
- 传递参数,frame的id/name/webelement元素
-
selement请求第一页的时候回等待页面加载完了之后再获取数据,再点击翻页完了之后会直接获取数据,此时可能会报错,应为数据没有加载完,需要使用time.sleep()让程序睡几秒
-
selenium中find_element_by_class_name只能接受一个cass对应的值,不能传入多个
验证码识别
-
url不变,验证码不变
- 请求验证码,获得相应,识别
-
url不变,验证码会变
-
思路: 对方服务器返回验证码的时候,会和每个用户的信息和验证码进行一个对应,之后,在用户发送post请求的时候,会对比post请求中发送的验证码和挡墙用户真正的存储字啊服务器端的验证码是否相同
-
1.实例化session
-
2.请求session请求登录页面,获取验证码的地址
-
3.使用session请求验证码,识别
-
4.使用session发送post请求
-
-
使用selenium登录,遇到验证码
- url不变,验证码不变,同上
- url不变,验证码会变
- 1.selenium请求登录页面,同时拿到验证码
- 2.获取登录页面中driver中的cookie,交给requests模块发送验证码请求,识别
- 3.输入验证码,点击登录