怎么识别爬虫自动化配置的Web爬虫

web安全(33)
& & 虽然自动爬虫扫描用起来很简单,但是存在如下缺点:
1. 不支持非普通的搜寻,例如动态生成的菜单或者复杂的javascript脚本,这样导致搜寻的页面不全
2. 隐藏在经过编译的客户端对象里面的链接,例如java applet或者flash不能被爬虫发现
3.多级功能往往不能接收由自动扫描工具提交的随意的数据,例如注册用户名的时候,往往需要填写正确的电话号码、email地址
4.为了避免扫描死循环,自动扫描往往把URL作为扫描的唯一标示符,也就是一个url扫描一次。但是对于某些情况,同一个URL可能会根据参数值返回不通的函数和内容进行下一步的处理。例如在使用网银的时候往/account.jsp发送请求,网银根据参数值决定下一步的行动。因此自动扫描器对一个URL只扫描一次往往会错过很多页面内容
5.URL数据里面可能被服务器放入了不是用来确定资源的volatile数据,这些数据每次请求都不一样,看起来总是像新的URL,这些数据可能导致扫描器死循环
6.虽然扫描器配置了认证之后能够通过认证后爬取页面,但是认证可能被以下几点原因打断
& & a. 爬虫扫描可能请求了退出按钮
& & b. 某些敏感的功能,接收到异常数据后有可能异常退出此次session
& & c, 服务器可能对每个页面添加了独特的token,自动爬虫扫描很可能不能有效处理这些token
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:80560次
积分:1740
积分:1740
排名:第19251名
原创:92篇
评论:17条
(1)(1)(4)(1)(1)(2)(3)(7)(7)(4)(2)(6)(2)(4)(1)(4)(3)(8)(6)(5)(8)(14)(2)我知道如果用php写网络爬虫自动抓取网页内容,那可以用现成函数,有url做参数就可以抓取到网页所有内容然后正则提取需要的内容。
那javascript有没有这种功能,例如我想在我自己的电脑上抓取大量网站,本机又无服务器环境,能否用js实现????有无类似功能?
如果给js一个url,它能否通过它抓取出这个页面的内容?
听说有类似ff插件,js写的能实现。具体不知道什么原理。
该问题被发起重新开启投票
投票剩余时间:
之前被关闭原因:
该问题被发起删除投票
投票剩余时间:
距离悬赏到期还有:
参与关闭投票者:
关闭原因:
该问题已经被锁定
锁定原因:()
保护原因:避免来自新用户不合宜或无意义的致谢、跟帖答案。
该问题已成功删除,仅对您可见,其他人不能够查看。
用Node.js做后端,http模块提供了获取网页的功能,然后你要做的就是分析其中的链接,然后继续抓取数据,示例代码如下:
var http = require('http');
var options = {
host: 'www.',
path: '/',
method: 'GET'};
var req = http.get(options, function(res) {
var pageData = "";
res.setEncoding('UTF-8');
res.on('data', function (chunk) {
pageData +=
res.on('end', function(){
console.log(pageData);
//这里处理抓取到的数据
不需要Firefox插件,需要Service-Side Javascrtip才能完成这样的功能。
可能,但是不现实。
首先一个爬虫需要能将爬取的内容进行归档和保存,JS没有直接的接口可以操作本地文件或者数据库,虽然可以通过flash或者firefox插件间接访问本地文件,但是也存在很多限制。
其次JS有安全限制,跨域的URL是无法直接访问的,也可以通过一些间接手段弥补,但非常麻烦
最后,爬虫需要有健壮的接口,还要考虑多并发高性能。JS只能通过计时器模拟多并发,而且非常容易内存泄漏,JS的爬虫很可能跑几个小时内存就满了,却没有办法回收。
爬虫还是建议考虑用C++这样的高性能语言,脚本语言可以考虑Python实现的,JS用来玩玩可以
首先,楼主意识上认为的是客户端脚本获取Javascript分两种编程
客户端脚本(常用Web开发客户端脚本)
服务端脚本(Node.js)
楼主要记得客户端脚本跨域是有限制的,如果想抓站 还是要借助后台实现,楼主现在可以用php 并不一定要用服务器,win下举例:php_path:\php.exe work_path\run.php这样也是可以跑脚本的如果想要结果输出也可以php_path:\php.exe work_path\run.php &out_path\result.txt
楼主想用的是工具脚本而非Web应用所以并不一定要借助服务器
我分别用过三种方式写过一些简单的爬虫, 下面是我对爬虫的理解和方法的总结(欢迎大家纠正和补充):
使用任何语言的http库(比如python的urllib2, 或者使用支持连接池的urllib3来提升效率), 外加解析html的库(比如python的beautifulsoup). 使用urllib来模拟get/post请求,从而抓取网页, 再通过解析html的库来获取需要抓取的内容. 能够得到一个页面的内容, 就可以通过url得到所有页面的内容.优点: 直接, 快速, 占用资源少, 可以多个进程/线程一起跑, 可以在命令行完成缺点: 这种方式的致命缺点是, 让遇到页面是通过js动态渲染或者通过ajax动态加载的内容, 则很难得到该页面的内容了. 这种情况下还需要js解释器(也可以说是浏览器)来进一步解析, 来得到想得到的内容.PS: 在遇到ip限制的时候可以设置代理.
使用firefox/chrome浏览器插件的方式(也就是javascript+浏览器的方式做爬虫)使用firefox的插件, 就不存在跨域访问提交的问题了. 这里是我去年写过的一个简单的firefox插件, 比较粗糙, 但是基本的流程是通的. 基本原理就是使用浏览器加载页面后, 用javascript/jquery来模拟点击等事件, 获取相应的内容, 然后post到远程服务器的url, 进行处理和保存. 或者写入浏览器本地的存储(比如sqlite)优点: 直观, 纯js实现, 方便使用jquery, 易于调试, 解决了方法1的动态内容渲染问题, 可以和浏览器交互, 容易解决验证码输入等限制缺点: 必须依赖本地浏览器, 速度慢, 比起方法1耗资源, 比较难多进程/线程, 或多或少的需要认为干预(因为我的代码写的不够好...)
第三种方法使用一个叫做的神器, 它是一个支持多语言接口的库, 通过它可以使用java/python/ruby等语言来操作浏览器(firefox/chrome等)来完成任务,通常用于前端代码的测试. 用这种方法写的爬虫, 还是通过python/java等语言来写主体结构(分析修改数据,存入数据库等等), 并通过selenium的js/jquery接口, 完成对网页内容的渲染和触发.优点: 结合了方法1,2的大部分优点.
1、基于web browser的无法实现,因对跨域访问限制,这个就不细说了,资料一大堆。
2、如果是本地宿主HOST,权限上是可以的,比如HTA(HTML Application)可以直接调用XMLHTTP、WinHttp等组件实现,特别值得一说的是WinHttp.WinHttpRequest所有php curl支持的它都支持。
可以,但是要想办法解决跨域访问的问题。我已经实现了用JS才做爬虫。流程很简单:自己的建了一个WEB项目作为爬虫,通过访问自己的项目,并让在项目页面中以iframe方式打开目标网址,用项目中的JS代码操作iframe中的页面,并把抓取到的数据通过ajax或普通请求提交到自己的服务器。
至于怎么解决跨域问题,我是借助了apache的代理实现了,比如:把指向127.0.0.1,然后通过apache代理,把/js_robot_hello_world指向自己的项目,其他请求正常指向/相应的子目录
就可以实现了。
可以,我以前用JS写了个采集软件,速度还行!!
用C#也可以实现爬虫,用js脚步个人感觉非常麻烦
用node.js 与phantomjs可以实现。
试着访问到网站之后,js用获取正文等算法,然后form表单提交到服务器去。
我又要说了,nodejs 和 js 不一样!node为了解决高io高并发的问题而生的。不过正好用了js语言,放v8里跑而已。所以我一直认为,js就是放浏览器里跑的,nodejs是服务器上的。别搞混了。爬虫是要有爬虫的节操的好么?有写网站已经设置了不让爬,你也要做到不爬。
这个放在浏览器里明显不现实,首先你怎么跨域?其次如何做到爬虫的节操?有人说用jsonp,有些人是不是一遇到跨域就说jsonp啊,先去看看jsonp的定义和实现细节好么。当然了,你硬要做,也是可以的,楼上好多为了用js而js的。但是何必呢,用iframe来,这是有多麻烦,要监听iframe里面dom ready,要搞一堆和爬虫本身无关的事情。关键在于,你一定要在浏览器里跑,但是脱离不了服务器端的配合,甚至还有路由之类的奇奇怪怪的事情。
如果你硬要用js语法来写这个东西,就用nodejs,放服务器上跑。然后这样和php什么的有什么区别么 …… 不过语法不同而已。
不是您所需,查看更多相关问题与答案
德问是一个专业的编程问答社区,请
后再提交答案
关注该问题的人
共被浏览 (26255) 次[python爬虫] Selenium常见元素定位方法和操作的学习介绍
一. 定位元素方法
官网地址:
这里有各种策略用于定位网页中的元素(locate elements),你可以选择最适合的方案,Selenium提供了一下方法来定义一个页面中的元素:
find_element_by_idfind_element_by_namefind_element_by_xpathfind_element_by_link_textfind_element_by_partial_link_textfind_element_by_tag_namefind_element_by_class_namefind_element_by_css_selector 下面是查找多个元素(这些方法将返回一个列表):
find_elements_by_namefind_elements_by_xpathfind_elements_by_link_textfind_elements_by_partial_link_textfind_elements_by_tag_namefind_elements_by_class_namefind_elements_by_css_selector
除了上面给出的公共方法,这里也有两个在页面对象定位器有用的私有方法。这两个私有方法是find_element和find_elements。
常用方法是通过xpath相对路径进行定位,同时也是比较好的方法。举例:
&form id=&loginForm&&
&input name=&username& type=&text&&
&input name=&password& type=&password&&
&input name=&continue& type=&submit& value=&Login&&
&input name=&continue& type=&button& value=&Clear&&
定位username元素的方法如下:
username = driver.find_element_by_xpath(&//form[input/@name='username']&)
username = driver.find_element_by_xpath(&//form[@id='loginForm']/input[1]&)
username = driver.find_element_by_xpath(&//input[@name='username']&)
[1] 第一个form元素通过一个input子元素,name属性和值为username实现
[2] 通过id=loginForm值的form元素找到第一个input子元素
[3] 属性名为name且值为username的第一个input元素
二. 操作元素方法
在讲述完定位对象(locate elements)之后我们需要对该已定位对象进行操作,通常所有的操作与页面交互都将通过WebElement接口,常见的操作元素方法如下:
clear 清除元素的内容send_keys 模拟按键输入click 点击元素submit 提交表单
举例自动访问FireFox自动登录163邮箱。
from selenium import webdriver
from mon.keys import Keys
import time
# Login 163 email
driver = webdriver.Firefox()
driver.get(&/&)
elem_user = driver.find_element_by_name(&username&)
elem_user.clear
elem_user.send_keys(&&)
elem_pwd = driver.find_element_by_name(&password&)
elem_pwd.clear
elem_pwd.send_keys(&******&)
elem_pwd.send_keys(Keys.RETURN)
#driver.find_element_by_id(&loginBtn&).click()
#driver.find_element_by_id(&loginBtn&).submit()
time.sleep(5)
assert &baidu& in driver.title
driver.close()
driver.quit()
首先通过name定位用户名和密码,再调用方法clear()清除输入框默认内容,如&请输入密码&等提示,通过send_keys(&**&)输入正确的用户名和密码,最后通过click()点击登录按钮或send_keys(Keys.RETURN)相当于回车登录,submit()提交表单。
PS:如果需要输入中文,防止编码错误使用send_keys(u&中文用户名&)。
三. WebElement接口获取值
通过WebElement接口可以获取常用的值,这些值同样非常重要。
size 获取元素的尺寸text 获取元素的文本get_attribute(name) 获取属性值location 获取元素坐标,先找到要获取的元素,再调用该方法page_source 返回页面
driver.title 返回页面标题current_url 获取当前页面的URLis_displayed() 设置该元素是否可见is_enabled() 判断元素是否被使用is_selected() 判断元素是否被选中tag_name 返回元素的tagName
举例代码如下:
from selenium import webdriver
from mon.keys import Keys
import time
driver = webdriver.PhantomJS(executable_path=&G:\phantomjs-1.9.1-windows\phantomjs.exe&)
driver.get(&/&)
size = driver.find_element_by_name(&wd&).size
print size
#尺寸: {'width': 500, 'height': 22}
news = driver.find_element_by_xpath(&//div[@id='u1']/a[1]&).text
print news
#文本: 新闻
href = driver.find_element_by_xpath(&//div[@id='u1']/a[2]&).get_attribute('href')
name = driver.find_element_by_xpath(&//div[@id='u1']/a[2]&).get_attribute('name')
print href,name
#属性值: / tj_trhao123
location = driver.find_element_by_xpath(&//div[@id='u1']/a[3]&).location
print location
#坐标: {'y': 19, 'x': 498}
print driver.current_url
#当前链接: /
print driver.title
#标题: 百度一下, 你就知道
result = location = driver.find_element_by_id(&su&).is_displayed()
print result
#是否可见: True
其中图片解释如下图所示。
四. 鼠标操作
在现实的自动化测试中关于鼠标的操作不仅仅是click()单击操作,还有很多包含在ActionChains类中的操作。如下:
context_click(elem) 右击鼠标点击元素elem,另存为等行为double_click(elem) 双击鼠标点击元素elem,地图web可实现放大功能drag_and_drop(source,target) 拖动鼠标,源元素按下左键移动至目标元素释放move_to_element(elem) 鼠标移动到一个元素上click_and_hold(elem) 按下鼠标左键在一个元素上perform() 在通过调用该函数执行ActionChains中存储行为 举例如下图所示,获取通过鼠标右键另存为百度图片logo。代码:
import time
from selenium import webdriver
from mon.keys import Keys
from mon.action_chains import ActionChains
driver = webdriver.Firefox()
driver.get(&&)
#鼠标移动至图片上 右键保存图片
elem_pic = driver.find_element_by_xpath(&//div[@id='lg']/img&)
print elem_pic.get_attribute(&src&)
action = ActionChains(driver).move_to_element(elem_pic)
action.context_click(elem_pic)
#重点:当右键鼠标点击键盘光标向下则移动至右键菜单第一个选项
action.send_keys(Keys.ARROW_DOWN)
time.sleep(3)
action.send_keys('v') #另存为
action.perform()
#获取另存为对话框(失败)
alert.switch_to_alert()
alert.accept()
效果如下图所示,通过xpath定位到图片位置并右击鼠标,在弹出的菜单中选择&另存为图片&。但是如何点击&另存为对话框&的&保存&按钮是个难点,目前刚学习阶段,境界没到无法解决。原因:
WebDriver cannot directly interact with dialog windows this is because dialog windows are the domain of the operating system and not the webpage.
该部分推荐参考资料:
书籍《selenium2 python自动化测试》 作者:虫师
五. 键盘操作
前面讲述了鼠标操作,现在讲述键盘操作。在webdriver的Keys类中提供了键盘所有的按键操作,当然也包括一些常见的组合键操作如Ctrl+A(全选)、Ctrl+C(复制)、Ctrl+V(粘贴)。更多键参考官方文档对应的编码。
send_keys(Keys.ENTER) 按下回车键send_keys(Keys.TAB) 按下Tab制表键send_keys(Keys.SPACE) 按下空格键spacesend_keys(Kyes.ESCAPE) 按下回退键Escsend_keys(Keys.BACK_SPACE) 按下删除键BackSpacesend_keys(Keys.SHIFT) 按下shift键send_keys(Keys.CONTROL) 按下Ctrl键send_keys(Keys.ARROW_DOWN) 按下鼠标光标向下按键send_keys(Keys.CONTROL,'a') 组合键全选Ctrl+Asend_keys(Keys.CONTROL,'c') 组合键复制Ctrl+Csend_keys(Keys.CONTROL,'x') 组合键剪切Ctrl+Xsend_keys(Keys.CONTROL,'v') 组合键粘贴Ctrl+V
这里使用的例子参考虫师的书籍《selenium2 python自动化测试》,推荐该书给大家。代码还是非常有意思的,大家自己去感受下吧~
#coding=utf-8
import time
from selenium import webdriver
from mon.keys import Keys
driver = webdriver.Firefox()
driver.get(&&)
#输入框输入内容
elem = driver.find_element_by_id(&kw&)
elem.send_keys(&Eastmount CSDN&)
time.sleep(3)
#删除一个字符CSDN 回退键
elem.send_keys(Keys.BACK_SPACE)
elem.send_keys(Keys.BACK_SPACE)
elem.send_keys(Keys.BACK_SPACE)
elem.send_keys(Keys.BACK_SPACE)
time.sleep(3)
#输入空格+&博客&
elem.send_keys(Keys.SPACE)
elem.send_keys(u&博客&)
time.sleep(3)
#ctrl+a 全选输入框内容
elem.send_keys(Keys.CONTROL,'a')
time.sleep(3)
#ctrl+x 剪切输入框内容
elem.send_keys(Keys.CONTROL,'x')
time.sleep(3)
#输入框重新输入搜索
elem.send_keys(Keys.CONTROL,'v')
time.sleep(3)
#通过回车键替代点击操作
driver.find_element_by_id(&su&).send_keys(Keys.ENTER)
time.sleep(3)
driver.quit()
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
基于爬虫的web自动化测试工具的设计
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 爬虫识别 的文章

 

随机推荐