如何将爬虫完全伪装成为用户在浏览器的点击行为

如何将爬虫完全伪装成为用户在浏览器的点击行为,第1张

1.伪装http header,我们可以使用phanomjs的API来实现:

派生到我的代码片

1. <span style="font-family:SimSunfont-size:18px">page.customHeaders = {

2. "Referer" : referrer,

3. "User-Agent" : "Mozilla/5.0 (Windows NT 6.1WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER 1.1"

4. }</span>

2.伪造referer欺骗js,这一点其实就要麻烦一些:我们需要首先打开referer页面,然后再模拟点击消息转到目的网站,具体方法如下:

1. <span style="font-family:SimSunfont-size:18px">page.onLoadFinished = function(status){

2.

3. // Only once do

4. if ( page.firstLoad ) {

5. page.firstLoad = false

6. // Inject and Click a Link to our target

7. page.evaluate(function (href) {

8. // Create and append the link

9. var link = document.createElement('a')

10. link.setAttribute('href', href)

11. document.body.appendChild(link)

12.

13. // Dispatch Click Event on the link

14. var evt = document.createEvent('MouseEvents')

15. evt.initMouseEvent('click', true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, link)

16. link.dispatchEvent(evt)

17. }, targetUrl)

18. } else {

19.// 此处我们已经成功伪造referer信息,并且打开Target url页面

20. console.log(targetUrl+"\t"+page.url)

21.

22. }

23. }</span>

3.伪造User Agent欺骗js,这一点其实就要麻烦一些,但是我们也可以通过phantomjs的API来实现:

在CODE上查看代码片

1. <span style="font-family:SimSunfont-size:18px">page.settings.userAgent = "Mozilla/5.0 (Windows NT 6.1WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER"</span>

4. 使用代理,这个phantomjs支持的就更好啦,调用的时候加入代理的参数即可:

派生到我的代码片

1. <span style="font-family:SimSunfont-size:18px">phantomjs --proxy=ip:port</span>

5.添加cookies(我知道phantomjs设置cookies可行,目前还没有验证,据称有以下三种方法):

page.customHeaders = {Cookie: xxx}

phantom.addCookie({

'name': 'yandexuid',

'value':'21611441383258191',

'domain': '.yandex.ru'))

})

phantomjs --cookies-file=cookies.txt

说到这里其实我们已经得到了一个动态的爬虫,它可以之行js代码,可以抓取到网页的动态内容,具有浏览器的header并且无法被js、ajax、java、php代码识别,甚至也无法被后台的日志分析识别。目前为止该方法的qps并不高,因为加载js和phantomjs并发性能不高。

其实这个爬虫有很多的用处:

1.伪造点击信息,最近CNZZ公布了中小网站的流量来源中30%是来自奇虎360的,众所周知CNZZ是植入js代码统计网站的访问量和来源的。这些完全可以用我们的代码伪造访问量,并且伪造访问来源呀。

2. 爬取网站动态内容,有很多网站是基于ajax和js设计的,现在我们就可以爬取到这些代码执行得到的数据。

3.逃避反爬虫策略,这个就太明显了。

1. 下载、安装selenium

下载地址:https://pypi.python.org/pypi/selenium 

目前的版本是:3.0.0b2 

支持:Firefox, Chrome, Internet Explorer, PhantomJS 

tar包的下载:selenium-3.0.0b2.tar.gz 

解压selenium-3.0.0b2.tar.gz,进入selenium-3.0.0b2目录,执行下面的命令安装: 

python setup.py install

2. 下载浏览器Driver Server

Internet Explorer Driver Server 

IEDriverServer_Win32_2.53.1.zip 

IEDriverServer_x64_2.53.1.zip 

如果下载不了,可以到IEDriverServer_Win32_2.53.1.zip,IEDriverServer_x64_2.53.1.zip中下载。

Firefox geckodriver 

geckodriver-v0.10.0-linux64.tar.gz 

geckodriver-v0.10.0-win64.zip 

geckodriver的其他版本

其他浏览器的driver server

解压,并将解压目录添加到环境变量中。

注意1:在windows 64位系统也要使用IEDriverServer Win32版本的,否则可能会出现错误In particular, be sure you are not attempting to use a 64-bit IEDriverServer.exe against IE 10 or 11, even on 64-bit Windows.

注意2:geckodriver不能在cygwin中使用。IEDriverServer在windows和cygwin环境中都可以使用。

注意3: 关于geckodriver的说明: 早期名字叫wires,如果提示wires找不到,可以将geckodriver重命名为wires。

3. 示例

3. 1 示例一:通过IE获取cookie

在python命令行中执行:

>>>from selenium import webdriver>>>ie = webdriver.Ie()>>>ie.get("http://www.cnvd.org.cn")>>>ie.get_cookies()

[{'value': 'CA2DD4EBD61BECAC3C19546F4AA52BD0', 'httpOnly': False, 'name': 'JSESSIONID', 'secure': False}, {'secure': False, 'httpOnly': False, 'expiry': 1470457299, 'value': '1470453699.622|0|sWEFsKmkH%2FTLajrFqRkRWKSdTeY%3D', 'domain': 'www.cnvd.org.cn', 'path': '/', 'name': '__jsl_clearance'}, {'value': '14dbf9b7ec3482ba76b140b2e2a8ae14', 'httpOnly': True, 'name': '__jsluid', 'secure': False}, {'secure': False, 'httpOnly': False, 'expiry': 1659704113, 'value': '1470401713484', 'domain': 'www.cnvd.org.cn', 'path': '/', 'name': 'bdshare_firstime'}]12345

如果你的IE浏览器页面的放大率不是100%,则会有如下错误: 

selenium.common.exceptions.WebDriverException: Message: Unexpected error launching Internet Explorer. Browser zoom level was set to 130%. It should be set to 100%

解决方法:点击浏览器右下角的“更改缩放级别”,改为100%

3.2 示例二:通过Firefox获取cookie

>>>from selenium import webdriver>>>firefox = webdriver.Firefox()>>>firefox.get("http://www.cnvd.org.cn")>>>firefox.get_cookies()

[{'name': '__jsluid', 'expiry': None, 'httpOnly': True, 'secure': False, 'path': '/', 'domain': 'www.cnvd.org.cn', 'value': '6227ceeae8067fc9f47f832093b92067'}, {'name': '__jsl_clearance', 'expiry': None, 'httpOnly': False, 'secure': False, 'path': '/', 'domain': 'www.cnvd.org.cn', 'value': '1470453972.745|0|5w9OUDO2vOYMvowWI%2BF3xGBQlf0%3D'}, {'name': 'JSESSIONID', 'expiry': None, 'httpOnly': False, 'secure': False, 'path': '/', 'domain': 'www.cnvd.org.cn', 'value': '91EC775B4CF2D948FC74E126D9E17013'}, {'name': 'bdshare_firstime', 'expiry': None, 'httpOnly': False, 'secure': False, 'path': '/', 'domain': 'www.cnvd.org.cn', 'value': '1470453972212'}]12345

在cygwin中执行firefox = webdriver.Firefox(),会有错误: 

selenium.common.exceptions.WebDriverException: Message: entity not found, 

在windows环境执行中不会有问题。

3.3 示例三:python脚本

get_cookie.py

import timefrom selenium import webdriverfrom selenium.common.exceptions import WebDriverExceptiondef GetCookie():

   url = "http://www.cnvd.org.cn/flaw/list.htm"

   cookies = []    try:

       print('open IE browser')

       ie = webdriver.Ie()

       print('visit cnvd website')

       ie.get(url)

       timesleep = 8 #需要延时,来获取完整的cookies

       print('sleep {} seconds'.format(timesleep))

       time.sleep(timesleep) # important to get full cookies

   except WebDriverException as wde:

       print(wde)        if ie != None:

           ie.quit()    else:

       print('get cookies...')

       cookies = ie.get_cookies()

       ie.quit()    if cookies == '' or type(cookies) != list  or cookies.__len__() == 0:

       print('cookie is not found')    else:

       print('cookies: {}, size: {}'.format(cookies, cookies.__len__()))

GetCookie()123456789101112131415161718192021222324252627282930

输出Log:

$ python3 get_cookie.py

open IE browser

visit cnvd website

sleep 8 seconds

get cookies...cookies: [{'name': 'JSESSIONID', 'value': '288C44E9485D45D8CD6DCF5ECD45FE48', 'httpOnly': False, 'secure': False}, {'httpOnly': False, 'path': '/', 'name': '__jsl_clearance', 'domain': 'www.cnvd.org.cn', 'expiry': 1472317063, 'value': '1472313463.29|0|qhvo%2BKl%2BfNxrWIU82bwTrL%2BxISE%3D', 'secure': False}, {'name': '__jsluid', 'value': 'c44ca6d63264ac8b08e969cfb0390c3b', 'httpOnly': True, 'secure': False}, {'httpOnly': False, 'path': '/', 'name': 'bdshare_firstime', 'domain': 'www.cnvd.org.cn', 'expiry': 1661615471, 'value': '1472313071070', 'secure': False}], size: 4123456

可能出现的问题: 

问题1:selenium.common.exceptions.NoSuchWindowException: Message: Unable to get browser

问题2:selenium.common.exceptions.WebDriverException: Message: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones. Enable Protected Mode must be set to the same value (enabled or disabled) for all zones.

解决方法1:Internet选项->安全->“Internet”,“本地Intranet”,“受信任的站点”,“受限制的站点”的“启用保护模式”需要设置成一样的。都设置成选中状态,可以解决。或者试试都设置成非选中状态。

解决方法2:在上面的解决方法用过之后,在windows中可能还会有问题Unable to get browser,可以尝试着以管理员权限打开cmd,也许会有惊喜。

PhantomJS 和 Chromedriver *** 作方式以及功能一致

主要区别 PhantomJS 无界面模式 节省内存

Chromedriver 完全模仿浏览器 消耗内存

PhantomJS 截取的是网页的完整页面,包括下拉进度条的内容

Chromedriver只截取d框浏览器的可视化内容页面

001 先找到文本输入框元素,输入内容

002 找到搜索按钮 进行搜索

给输入框赋值: element.send_keys()

*** 作点击事件: element.click()

find_element和find_elements的区别

带s的返回的是列表

不带s的是返回列表中的第一个元素

selenium处理cookie

页面等待 : https://www.jianshu.com/p/835bd3e96f5b

01 强制等待

time.sleep(10) 强制要求在时间内出现,否则报错,不能很好的控制时间,浪费资源

02 隐示等待

隐性等待对整个driver的周期都起作用,所以只要设置一次即可

隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。

driver.implicitly_wait(30) # 隐性等待,最长等30秒

03 显示等待

这里需要特别注意的是until或until_not中的可执行方法method参数,很多人传入了WebElement对象,如下:

这是错误的用法,这里的参数一定要是可以调用的,即这个对象一定有 call () 方法,否则会抛出异常:

TypeError: 'xxx' object is not callable

switch方法切换的 *** 作

01窗口切换

iframe是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是

思路:先定位并切换至iframe内,再进行你安排前元素 *** 作 最后可通过切换至窗口,从iframe中切换出iframe 进入到页面

当你触发了某个事件之后,页面出现了d窗提示,处理这个提示或者获取提示信息方法:driver.switch_to.alert() # 跟frame一样的处理方式!

页面前进和后退

selenium 三大重要功能

三个可以同时使用

selenium的优缺点

• selenium能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易

• selenium由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11226529.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存