- 处理cookie
coolie
作为前端常用的本地存储方式之一,在各网站往往发挥着很重要的作用,比如:保存用户信息以及登录状态。
- 部分站点会在前端发起
http请求
时携带cookie
,以此来验证用户是否登录,以及登录用户。并对站点信息进行限制,比如某些信息仅在登录状态可见。 - 还有部分网站同一
cookie
访问频率过高会被封,此时则需要禁用cookie
。 - 实际情况允许条件下利用Selenium实现自动化生成
cookie
。如下:自动获取boos直聘网站cookie
from selenium import webdriver
def getCookie(self):
cookie_dict = {}
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
self.brower = webdriver.Chrome(chrome_options=chrome_options)
self.brower.get('http://www.zhipin.com')
cookies_list = self.brower.get_cookies()
self.brower.close()
for cookie in cookies_list:
cookie_dict[cookie['name']] = cookie['value']
return cookie_dict
- 维护cookie列表使用时,随机抽取
- User-Agent
http请求头的一部分,向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。许多网站会对该信息进行识别,以判断是否为爬虫程序。
因此在爬虫程序发起http请求时,常设置伪装User-Agent
,来模拟真实浏览器。可自己维护一个列表存储虚假的User-Agent
,使用时随机抽取,或使用第三方库,例如:fake_useragent
demo
import random
user_agent = [
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
"Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
"Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10",
"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)",
"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 GTB5",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729; .NET4.0E)",
"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
"Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110622 Firefox/6.0a2",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"
]
def getUserAgent():
return random.choice(user_agent)
-
设置代理ip
当对目标网站访问频率过高时,往往会被默认识别为网络爬虫。而禁止高频率访问ip访问往往是最常用的反爬手段。此时则需要使用代理ip来访问目标站点。
可自维护ip代理池或购买代理ip,在ip被封后更换代理ip,继续爬取。 -
控制爬取频率
高频率请求目标站点则容易被目标站点封锁,而对于一些小站点还可能会造成服务器瘫痪的问题。因此要适当控制请求频率。建议休眠时间为一个随机值
可使用例如:
#2~6s随机休眠来控制
time.sleep(random.randrange(2, 6))
-
分类处理多套前端项目结构
部分网站会识别访问者为疑似爬虫代码,于是会返回不同页面结构的网页,对于此种情况可进行类型判断,实现分类爬取。 -
Selemium
Selenium是一自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击,拖动等。现在网站多为前后端分离项目,部分数据需要AJAX请求获取,而通过AJAX 接口的数据多为加密数据,因此需要模拟浏览器行为来获取目标数据。此时Selenium十分适合。总之利用该工具,尽可能模拟实际用户操作。
资料
- 验证码识别(实际体验不是很理想,提供相关资料参考
极验验证demo
# # boos直聘模拟滑动登录
# @classmethod
# def userLogin(cls, browser):
# mySetting = get_project_settings()
# indexLoginBtn = browser.find_element_by_xpath("//a[@ka='header-login']")
# indexLoginBtn.click()
# accountIpt = browser.find_element_by_xpath("//input[@name='account']")
# passwordIpt = browser.find_element_by_xpath("//input[@name='password']")
# slider = browser.find_element_by_css_selector('.btn_slide')
# loginBtn = browser.find_element_by_css_selector('.btn')
# accountIpt.send_keys(mySetting.get('USER_NAME'))
# passwordIpt.send_keys(mySetting.get('USER_PASSWORD'))
# ActionChains(browser).click_and_hold(slider).perform()
# tracks = cls.get_track(280)
# for x in tracks:
# ActionChains(browser).move_by_offset(xoffset=x, yoffset=0).perform()
# time.sleep(0.5)
# ActionChains(browser).release().perform()
# time.sleep(1)
# loginBtn.click()
#
# # 获取轨迹
# @classmethod
# def get_track(cls, distance):
# # 移动轨迹
# track = []
# # 当前位移
# current = 0
# # 减速阈值
# mid = distance * 4 / 5
# # 计算间隔
# t = 0.2
# # 初速度
# v = 0
#
# while current < distance:
# if current < mid:
# a = 2
# else:
# a = -3
# v0 = v
# v = v0 + a * t
# move = v0 * t + 1 / 2 * a * t * t
# current += move
# track.append(round(move))
# return track
资料