硒爬行器中的后坑

电脑杂谈  发布时间:2020-03-27 00:05:24  来源:网络整理

selenium做爬虫_selenium python 爬虫_selenium 爬虫

文章目录

Selenium是一个相对常见的Web应用程序自动化测试库. 它支持多种浏览器,主要用于解决搜寻器中的JavaScript渲染问题.

当请求时,urllib *无法正常获取网页内容,使用它来模拟浏览器以加载网页,并且您可以获得一些无法直接在网页源代码中看到的内容.

我使用硒及其相关库,可能已经尝试使用无头铬,无头Firefox和phantomjs. 这些无接口浏览器当然具有自己的优势,因此在这里不必过多评论.

由于selenium本机代码似乎没有post方法,因此要花很多精力来测试测试用例. 在这里,我将以无头firefox模式为例,简要讨论如何将数据发布到硒中.

selenium做爬虫_selenium python 爬虫_selenium 爬虫

以seleniumrequests为例,该库是selenium扩展,因此selenium也可以使用请求功能,我们可以使用pip来安装:

pip install selenium-requests

或者,您可以在gayhub上进行克隆:

https://github.com/cryzed/Selenium-Requests

当然selenium做爬虫,此库的使用非常简单:

selenium做爬虫_selenium 爬虫_selenium python 爬虫

# selenium.webdriver from the seleniumrequests module
from seleniumrequests import Firefox
# Simple usage with built-in WebDrivers:
webdriver = Firefox()
response = webdriver.request('GET', 'https://www.google.com/')
print(response)

但是该库也有其缺点,自定义某些驱动器模式参数很不方便,并且无法设置无头状态(也许我自己盲目尝试过). 有兴趣的朋友可以自己研究,他们的支持如下:

>>> dir(seleniumrequests)
['Android', 'Chrome', 'Firefox', 'Ie', 'Opera', 'PhantomJS', 'Remote', 'RequestMixin', 'Safari', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__warningregistry__', 'request']

想象一下屏幕,爬上页面后,您将获得一个浏览器. 这个TM很酸.

我不太喜欢这种方法,但是有些人似乎很尊重它. 原理是解析原始的发布请求,重构传递到表单中的参数,最后将这些新生成的代码保存到html网页.

selenium做爬虫_selenium 爬虫_selenium python 爬虫

最后,程序将借用硒来定位Submit元素并触发事件提交表单.

我认为此方法不合适,每次打开网页程序时,都必须生成一个新的html文件. 无论程序是否必须具有写和删除权限,该方法本身都比较麻烦.

似乎在FB上有一篇与此方法类似的文章,因此代码不在此处发布.

Ajax模拟了发送帖子的请求,这是我自己使用的方法. 当然,效果是平均的,我相信应该会更好.

无论是本机JS中的XMLHttpRequest还是JQuery,您都可以模拟ajax发布请求,并最终使用Selenium执行JS代码.

selenium做爬虫_selenium python 爬虫_selenium 爬虫

XMLHttpRequest示例片段:

brower = webdriver.Firefox(firefox_options=fireFoxOptions)
js = """var xmlhttp=new XMLHttpRequest();
        xmlhttp.open("GET","http://127.0.0.1/get.php",false);
        xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xmlhttp.setRequestHeader("User-Agent","Mozilla/5.0");
        xmlhttp.setRequestHeader("Cookie","");
        xmlhttp.send("test=1");
        return xmlhttp.responseText;
	    """ 
brower.implicitly_wait(30)
#time.sleep(30)
resp = brower.execute_script(js)

jquery示例片段:

jquery = open("jquery.min.js", "r").read()
driver = webdriver.Firefox(firefox_options=fireFoxOptions)
driver.execute_script(jquery)
ajax_query = '''
            $.ajax('%s', {
            type: %s,
            data: %s, 
            headers: { "User-Agent": "Mozilla/5.0" },
            crossDomain: true,
            xhrFields: {
             withCredentials: true
            },
            success: function(){}
            });
            ''' % (url, request_type, data)
ajax_query = ajax_query.replace(" ", "").replace("\n", "")
resp = driver.execute_script("return " + ajax_query)

但这仍然是有缺陷的. 通过预先访问将通过driver.get请求的URL,我们可以解决跨域问题.

但是由于w3g的安全设置,我们无法自行在JS中预先设置危险的标头参数,例如cookie(跨域传输称为),Referer等.

如果我们在模糊请求数据包的标头(例如Referer)中需要一些不受欢迎的参数selenium做爬虫,则此方法将具有一定的局限性. 我暂时还没有找到其他解决方案,希望一些大个子能给我一些建议.

简而言之,很遗憾,硒没有本机发布方法,并且其浏览器调用无头模式,渲染和启动速度太慢,这很难应用于具有高并发性的单台计算机.

同样,由于其定位和特性. 我个人认为,在资源有限的情况下,它不适合用于高并发性的测试,并且效率低下和准确的模糊测试是可以接受的.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-153518-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...