Python 爬虫工具

selenium

能够模拟批量获取页面下所有内容:(这是个特别强的工具,几乎就是模拟真人爬虫…,缺点就是会真的操控你的浏览器打开,效率低)

基本使用

导入selenium模块,使用里面的webdriver类,需要下载一个浏览器驱动并放在python目录下,这里下载的是chromedriver:http://chromedriver.storage.googleapis.com/index.html?path=2.26/
要看对应版本:
https://blog.csdn.net/huilan_same/article/details/51896672
然后再将chrome的地址环境变量加入到path

WebDriver

控制整个浏览器用的

实例
from selenium import webdriver
browser = webdriver.Chrome()    #用chrome内核打开浏览器,同理如果要火狐的就Firefox()
browser.get("http://www.baidu.com")     #会以前面的浏览器内核打开该网址
browser.get_screenshot_as_file('mmm.jpg')       #将当前浏览的页面保存到本地
print(browser.page_source)      #打印源代码
browser.close()     #关闭浏览器
常用方法

上面的browser控制整个chrome,所以他是webdriver,而get()close()这些控制浏览器的就是webdriver的方法,其常用的方法还有:
`
(1)browser.page_source:获取当前页面源代码
(2)browser.curren_url:获取当前加载页面的 URL
(3)browser.close():关闭当前窗口, 如果当前窗口是最后一个窗口, 浏览器将关闭
(4)browser.quit():关闭所有窗口并停止 ChromeDriver 的执行
(5)browser.add_cookie(cookie_dict) :为当前会话添加 cookie ,举例:

driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’}) 
driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’}) 
driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’, ‘secure’:True})

(6)browser.get_cookie(name) :得到执行 cookie
(7)browser.get_cookies():得到所有的 cookie
(8)browser.delete_all_cookies():删除当前会话的所有cookie
(9)browser.delete_cookie(name) :删除指定 cookie
(10)browser.back():相当于浏览器的后退历史记录
(11)browser.forward():相当于浏览器的前进历史记录
(12)browser.execute_script(script, *args) :同步执行 js 脚本,举例:

browser.execute_script('alert("a")'),结果会弹出一个a的弹窗

(13)browser.execute_async_script(script, *args) :异步执行 js 脚本
(14)browser.get(url) :在当前窗口加载 url
(15)browser.refresh():刷新当前页面
(16)browser.switch_to.frame() :转到页面的某个frame里
(17)browser.switch_to.parent_frame() :返回父类的frame
(18)browser.current_window_handle:当前窗口的 handle, 相当于一个指针一样的东西, 用来指向当前窗口
(19)browser.window_handles : 当前浏览器中的已经打开的所有窗口, 是一个 list
(20)browser.switch_to_window(window_handle) : 切换 window_handle 指向的窗口
(21)browser.title : 当前页面的 title
(22)browser.name : 当前浏览器的名字

WebElement

用于定位标签,自动打开浏览器后我们可以定位标签,然后对该标签进行操作,常用定位标签方式如下:

find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()  #获取多个元素,id前面加#,class前面加.,多个之间用空格隔开

注:
如果要定位一组标签的话,就在element后面加s,比如:find_elements_by_id(),获取标签后就可以对该标签进行操作了,比如某网页一个标签点击后会进入下个界面,举例:

a = browser.find_element_by_id("j-nav-catebtn")     #获取该标签
print(a.text)   #输出标签的文本内容
b = a.click()   #点击该标签
time.sleep(5)   #给你5秒钟观赏一下

上面的a就是定位的一个标签(是网易云课堂的一个标签,点击会进入首页),也就是webelementclick()是其的一个方法,还有其他很多常用方法。

常用的方法
clear() : 清楚元素的内容, 假如这个元素是一个文本元素
click() : 点击当前元素
is_displayed() : 当前元素是否可见
is_enabled() : 当前元素是否禁止, 比如经常会禁用一些元素的点击
is_selected() : 当前元素是否选中, 文本输入框的内容
send_keys(*value) : 向当前元素模拟键盘事件,输入内容
get_attribute(name) : 获取元素属性,比如该标签的class是什么
submit() : 提交表单
id :标签的id
location :标签在页面中的位置(x,y坐标)
size :标签尺寸大小
rect :把location和size结合起来
tag_name : 当前元素的标签名
text : 当前元素的内容
往网页标签传值

比如像登录操作时我们一般可以通过先定位标签,然后用send_keys()往标签传值(有时如果里面有值就通过clear()清空先),举例(这里测试的是一个自己随便写的网站):

a = browser.find_element_by_name("name")        #索引到帐号部分
b = browser.find_element_by_name("password")
a.send_keys("aaa")      #输入帐号
b.send_keys("111")
c = browser.find_elements_by_tag_name("input")
#因为submit标签没有设置name和id,而整个网页里这是第三个标签
#所以先定位一组input,到时候点击第三个就行了
c[2].click()

上面的最后提交数据还可以定位表单然后提交,比如上面那个网页就一个表单,所以把最后两行改成:

c = browser.find_element_by_tag_name("form")
c.submit()

这里还对一个测打字速度的网页写了个自动化脚本测试极限速度,代码如下:

from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://10fastfingers.com/typing-test/simplified-chinese")

c = browser.find_element_by_id("inputfield") 
try:
    while True:
        a = browser.find_element_by_class_name("highlight")
        b = str(a.text)
        if b:
            c.send_keys(b + " ")
        else:
            break

except:
    pass
更多参考

https://www.cnblogs.com/zhaof/p/6953241.html
https://www.cnblogs.com/hanxiaobei/p/6108677.html

selenium使用注意

使用selenium访问网站并不是检测不出来,其有以下启动特征可以被检测到:
http://www.python66.com/seleniumjiaocheng/181.html
selenium存在的问题如下:
http://www.python66.com/seleniumjiaocheng/156.html

phantomjs

这个是无头浏览器,其也可以像前面那样自动化测试,但是没有界面,所以效率也会高一些,然后也可以解析js文件。

配置

1.下载地址:
http://phantomjs.org/download.html
2.配置:将其.exe的路径加入到path中,到命令行输入phantomjs如果进入shell就说明配置成功
解析js:cmd切换到js文件目录下,输入:phantomjs xxx.js就行了

使用

其使用方法和前面selenium几乎一样,导包也是from selenium import webdriver,然后browser = webdriver.Chrome()Chrome改成PhantomJS就行了,然后可以设置窗口大小:set_window_size,而且他比selenium有个地方好就是官网有对应api,让你设置比如是否加载图片,选择不加载可以提升速度,api网址:
http://phantomjs.org/api/
找到命令行的,然后把对应的配置到service_args参数里即可,举例:

from selenium import webdriver

url = 'http://www.baidu.com'
SERVICE_ARGS = ['--load-images=false', '--disk-cache=true']  #api中设置不加载图片,开启缓存
browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)  #传入api参数,如果不传括号里空就好了
# browser.set_window_size(1400, 900)        #设置窗口大小,也可以不设置
browser.get(url)
print(browser.page_source)
browser.close()

pyexecjs

也是解析js用的,需要pip安装后,import execjs

使用举例
>>> execjs.eval("'red yellow blue'.split(' ')")   #eval将代码还原原本意思
['red', 'yellow', 'blue']
>>> ctx = execjs.compile("""
    function add(x, y) { 
        return x + y; 
    } 
""")
#将js代码放入里面编译,也可以将js代码放入别的文件,然后在py下读取后放入这里面
>>> ctx.call("add", 1, 2)  #call里面是要调用的函数名和传入的参数
3
>>> ctx = execjs.compile("""
     add = (x, y) => x + y;
     y = function(x){return x.toString()}
 """)
>>> ctx.eval("y(add)")
# 可以看到在该编译环境下,所有的内容都在同一个context里
'(x, y) => x + y'

注:
如果上面es6的代码无法执行,说明可能没有配置node环境,那么首先需要安装node,然后配置环境如下:

os.environ["EXECJS_RUNTIME"] = "Node"

切换成普通JS环境:

jscript = execjs.get(execjs.runtime_names.JScript)
print(jscript.name)
jscript.eval("1 + 2")
更多参考

通过pyexecjs实现google翻译:
https://blog.csdn.net/yingshukun/article/details/53470424

js2py

也是解析JS用,个人认为这个模块十分好用,pip install js2py

eval_js()

执行单个js语句,举例:

>>> js2py.eval_js('a=1;a+1')
2
EvalJs

执行js函数,举例:
调用执行代码:

>>> import js2py
>>> context = js2py.EvalJs()
>>> fun_js = """function aaa(a) {
    b = a + 1;
    return b
}"""
>>> data_js = "let x = 1"
>>> context.execute(fun_js)
# 执行fun_js代码
>>> context.execute(data_js)
>>> context.aaa(context.x)
2
# 执行aaa()函数,并传入参数x

这里提供一个利用该模块实现的js逆向案例:https://blog.csdn.net/guodejie/article/details/81436556

更多参考

https://www.seoxiehui.cn/article-38590-1.html

你可能感兴趣的:(Python 爬虫工具)