有python 爬虫 执行js能执行 js 得到最终的 html 并输出么

Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容 - 华天清 - 博客园
随笔 - 33, 文章 - 0, 评论 - 10, 引用 - 0
1,引言在一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor。本文记录了确定gsExtractor的技术路线过程中所做的编程实验。这是第二部分,第一部分实验了用xslt方式一次性。留下了一个问题:javascript管理的动态内容怎样提取?那么本文就回答这个问题。2,提取动态内容的技术部件在上一篇中,要提取的内容是直接从网页的source code里拿到的。但是一些Ajax动态内容是在source code找不到的,就要找合适的程序库把异步或动态加载的内容加载上来,交给本项目的提取器进行提取。python可以使用执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。selenium自己不带浏览器,可以使用第三方浏览器如Firefox,Chrome等,也可以使用headless浏览器如在后台执行。
3,源代码和实验过程
假如我们要抓取的手机名称和价格(价格在网页源码是找不到的),如下图:
第一步:利用集搜客谋数台的直观标注功能,可以极快速度自动生成一个调试好的抓取规则,其实是一个标准的xslt程序,如下图,把生成的xslt程序拷贝到下面的程序中即可。注意:本文只是记录实验过程,实际系统中,将采用多种方式把xslt程序注入到内容提取器重。
第二步:执行如下代码(在windows10, python3.2下测试通过,源代码下载地址请见文章末尾GitHub),请注意:xslt是一个比较长的字符串,如果删除这个字符串,代码没有几行,足以见得Python之强大
#/usr/bin/python
from urllib import request
from lxml import etree
from selenium import webdriver
import time
# 京东手机商品页面
url="http://item.jd.com/1312640.html"
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的
xslt_root = etree.XML("""\
&xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" &
&xsl:template match="/"&
&xsl:apply-templates select="//*[@id='itemInfo' and count(.//*[@id='summary-price']/div[position()=2]/strong/text())&0 and count(.//*[@id='name']/h1/text())&0]" mode="商品"/&
&/xsl:template&
&xsl:template match="//*[@id='itemInfo' and count(.//*[@id='summary-price']/div[position()=2]/strong/text())&0 and count(.//*[@id='name']/h1/text())&0]" mode="商品"&
&xsl:value-of select="*//*[@id='summary-price']/div[position()=2]/strong/text()"/&
&xsl:value-of select="*[@id='summary-price']/div[position()=2]/strong/text()"/&
&xsl:if test="@id='summary-price'"&
&xsl:value-of select="div[position()=2]/strong/text()"/&
&xsl:value-of select="*//*[@id='name']/h1/text()"/&
&xsl:value-of select="*[@id='name']/h1/text()"/&
&xsl:if test="@id='name'"&
&xsl:value-of select="h1/text()"/&
&/xsl:template&
&/xsl:stylesheet&""")
# 使用webdriver.PhantomJS
browser=webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
browser.get(url)
time.sleep(3)
transform = etree.XSLT(xslt_root)
# 执行js得到整个dom
html = browser.execute_script("return document.documentElement.outerHTML")
doc = etree.HTML(html)
# 用xslt从dom中提取需要的字段
result_tree = transform(doc)
print(result_tree)
第三步:可以看到,网页中的手机名称和价格被正确抓取下来了
4,接下来阅读至此,我们通过两篇文章演示怎样抓取静态和动态网页内容,都采用了xslt一次性将需要的内容从网页上提取出来,其实xslt是一个比较复杂的程序语言,如果手工编写xslt,那么还不如写成离散的xpath。如果这个xslt不是手工写出来的,而是程序自动生成的,这就有意义了,程序员再也不要花时间编写和调测抓取规则了,这是很费时费力的工作。下一篇《》将讲述怎样生成xslt。5,集搜客GooSeeker开源代码下载源1.&
6,文档修改历史
:V2.0,增补文字说明:V2.1,增加第五章:源代码下载源,并更换github源的网址Access denied | www.lovelucy.info used Cloudflare to restrict access
Please enable cookies.
What happened?
The owner of this website (www.lovelucy.info) has banned your access based on your browser's signature (43c557e44f789913-ua98).查看: 6601|回复: 8
python 爬虫帮忙js文件如何的获取里面的内容
马上注册加入鱼C,享用更多服务吧^_^
才可以下载或查看,没有帐号?
本帖最后由 瞬秒爆加速 于
19:19 编辑
& &最近在爬一个漫画网站的图片,但是发现是有获取网址是放在js文件里面,然后用通过js函数反馈网址和图片,现在我找到js的规律了,就是不知道怎么获取找到的js文件里面的内容?
&&请鱼神,指导一下~_~.1-这个漫画的地址:
http://comic.sfacg.com/HTML/HXYZ/121/
2-这个我找到的js数据:
http://comic.sfacg.com/Utility/.js
现在是1-的网址,获取的信息,是js动态生成的,2-网址是储存动态生成的数据。现在是获取js里面的内容。
但是urllib.request.urllib().read().decode('utf-8'),报错。
至少也得给了栗子嘛。。
至少也得给了栗子嘛。。
我更新了,我给出了栗子了。
新手不懂帮顶
import re
import requests
import urllib.request
html = requests.get('http://comic.sfacg.com/Utility/.js')
html.encoding = 'utf-8'
find_all = re.findall(r'picAy\[[0-9]*\] = &(.*?\.(?:png|jpg))',html.text)
for i,j in zip(find_all, range(len(find_all))):
& & urllib.request.urlretrieve('http://comic.sfacg.com'+i,str(j)+i[-4:])复制代码
requests需要下载。pip install requests就行啦。
下载那个requests里没找到。。
不用requests也行。
import re
import urllib.request
html = urllib.request.urlopen('http://comic.sfacg.com/Utility/.js').read().decode('utf-8')
find_all = re.findall(r'picAy\[[0-9]*\] = &(.*?\.(?:png|jpg))',html)
for i,j in zip(find_all, range(len(find_all))):
& & urllib.request.urlretrieve('http://comic.sfacg.com'+i,str(j)+i[-4:])复制代码
效果一样。直接改001-121的js就行啦。目录你在os创建吧。
P.S这漫画好H好恶心。。
requests需要下载。pip install requests就行啦。
下载那个requests里没找到。。
我按你第二种尝试了一下,发现121获取不了,其他的却没问题.
P.S 这漫画是新生代的,恶心是正常的,反映了未来社会的现状。。。的,很有哲学系的。
我按你第二种尝试了一下,发现121获取不了,其他的却没问题.
P.S 这漫画是新生代的,恶心是正常的,反 ...
pip install requests 老是显示这个 Fatal error in launcher 这个错误,我在网上搜索了结果是
要用 python -m pip install requests
我按你第二种尝试了一下,发现121获取不了,其他的却没问题.
P.S 这漫画是新生代的,恶心是正常的,反 ...
- -。我就测试了一下第一话。121话没测试。。没在家,你先改改吧。
P.S我看了一话,不适合我- -。。
- -。我就测试了一下第一话。121话没测试。。没在家,你先改改吧。
P.S我看了一话,不适合我- -。。
好的,我在想应该是那个网站不稳定吧。有时候可以有时就不行,不过谢谢。我学到了一些。跟 甲鱼神 视频教的简短多了。
小甲鱼强烈推荐 /1
新的视频新的面貌,希望大家喜欢 (≧∇≦)ノ
- - - - - - - - - - - -
新课程,新体验!
Powered byPython 爬虫如何获取 JS 生成的 URL 和网页内容?
原创
 16:22:46
731
想尝试爬下北邮人的论坛,但是看到页面的源代码都是js,几乎没有我想要的信息。回复内容:
今天偶然发现了PyV8这个东西,感觉就是你想要的。它直接搭建了一个js运行环境,这意味着你可以直接在python里面执行页面上的js代码来获取你需要的内容。参考:http://www.silverna.org/blog/?p=252https://code.google.com/p/pyv8/
我是直接看js源码,分析完,然后爬的。例如看页面是用Ajax请求一个JSON文件,我就先爬那个页面,获取Ajax所需的参数,然后直接请求JSON页,然后解码,再处理数据并入库。如果你直接运行页面上所有js(就像浏览器做的那样),然后获取最终的HTML DOM树,这样的性能非常地糟糕,不建议使用这样的方法。因为Python和js性能本身都很差,如果这样做,会消耗大量CPU资源并且最终只能获得极低的抓取效率。
js代码是需要js引擎运行的,Python只能通过HTTP请求获取到HTML、CSS、JS原始代码而已。不知道有没有用Python编写的JS引擎,估计需求不大。我一般用PhantomJS、CasperJS这些引擎来做浏览器抓取。直接在其中写JS代码来做DOM操控、分析,以文件方式输出结果。让Python去调用该程序,通过读文件方式获得内容。
去年还真爬过这样的数据,因为赶时间,我的方法就比较丑陋了。PyQt有一个具体的库来模拟浏览器请求和行为(好像是webkit,忘记了,查一下就好。使用时就几行代码就够了),在一次运行程序中,第一次(只有第一次)的返回结果是js运行之后的代码。于是写了一个py脚本做一次访问解析,然后再写了windows脚本通过传递命令行参数循环这个py脚本,最后搞到数据。方法dirty了些,不过数据拿到了就好~
针对某网站的,可以自己看网络请求找到返回实际内容的那些有针对性地发。如果是通用的,得用 headless browser 了,比如 PhantomJS。
又一个爬北邮人论坛的。。文艺的方法,上浏览器引擎,比如 PhantomJS ,用它导出 html,再对html用 python 解析。千万别直接 PhantomJS 解析,虽然我知道这很容易,为什么?&del&那就不叫 python 爬虫了啊&/del& 因为统一使用 python 做解析更统一,这里假设你还在爬取非 JS 页面。普通的方法,分析 AJAX 请求。即使它是 JS 渲染的,数据还是通过 HTTP 协议传输的。什么?你模拟不出来?&del&去读一遍HTTP协议&/del&,其实还是经验,比如北邮人论坛请求正文时需要X-Requested-With:XMLHttpRequest
这里举个栗子:拉勾网的职位列表点击了Android之后 我们从浏览器上传了几个参数到拉勾的服务器一个是 first =true, 一个是kd = android, (关键字) 一个是pn =1 (page number 页码)所以我们就可以模仿这一个步骤来构造一个数据包来模拟用户的点击动作。post_data = {'first':'true','kd':'Android','pn':'1'}
虽然这是一个很久以前的问题,题主似乎也已经解决的这个问题。但是看到好多答案的办法有点太重了,这里分享一个效率更优、资源占用更低的方法。由于题主并没有指明需要什么,这里的示例取首页所有帖子的链接和标题。首先请一定记住,浏览器环境对内存和CPU的消耗都非常严重,模拟浏览器环境的爬虫代码要尽可能避免。请记住,对于一些前端渲染的网页,虽然在HTML源码中看不到我们需要的数据,但是更大的可能是它会通过另一个请求拿到纯数据(很大可能以JSON格式存在),我们不但不需要模拟浏览器,反而可以省去解析HTML的消耗。然后,打开北邮人论坛的首页,发现它的首页HTML源码中确实没有页面所显示文章的内容,那么,很可能这是通过JS异步加载到页面的。通过浏览器开发工具(Chrome浏览器在OS X下通过command+option+i或Win/Linux下通过F12)分析在加载首页的时候请求,容易发现,如下截图中的请求:截图中选中的请求得到的response即是首页的文章链接,在preview选项中可以看到渲染后的预览图:截图中选中的请求得到的response即是首页的文章链接,在preview选项中可以看到渲染后的预览图:至此,我们确定这个链接可以拿到首页的文章及链接。至此,我们确定这个链接可以拿到首页的文章及链接。在headers选项中,有这次请求的请求头及请求参数,我们通过Python模拟这次请求,即可拿到相同的响应。再配合BeautifulSoup等库解析HTML,即可得到相应的内容了。对于如何模拟请求和如何解析HTML,请移步我的专栏,有详细的介绍,这里便不再赘述。通过这样的方式可以不用模拟浏览器环境来抓取数据,对内存和CPU消耗、抓取速度都有很大的提升。在编写爬虫的时候,请务必记得,如非必要,不要模拟浏览器环境。
如果是在windows下,可以尝试调用windows系统中的webbrowser控件。另外ie本身也提供了接口。不过这两种方式都要渲染页面,性能上多少有点浪费,为了加快速度可以把ie的图片下载显示关闭掉,然后通过click等方法来模拟真实行为。
Google Phantom JS
江湖传言:PHP是世界上最好的编程语言。真的是这样吗?这个梗究竟是从哪来的?学会本课程,你就会明白了。
PHP中文网出品的PHP入门系统教学视频,完全从初学者的角度出发,绝不玩虚的,一切以实用、有用...
ThinkPHP是国内最流行的中文PHP开发框架,也是您Web项目的最佳选择。《php.cn独孤九贱(5)-ThinkPHP5视频教程》课程以ThinkPHP5最新版本为例,从最基本的框架常识开始,将...
本套教程,以一个真实的学校教学管理系统为案例,手把手教会您如何在一张白纸上,从零开始,一步一步的用ThinkPHP5框架快速开发出一个商业项目。
《php.cn原创html5视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了HTML知识。
所有计算机语言的学习都要从基础开始,《PHP入门视频教程之一周学会PHP》不仅是PHP的基础部分更主要的是PHP语言的核心技术,是学习PHP必须掌握的内容,任何PHP项目的实现都离不开这部分的内容,通...
本课以最新版ThinkPHP5.0.10为基础进行开发,全程实录一个完整企业点,从后台到前台,从控制器到路由的全套完整教程,不论是你是新人,还是有一定开发经验的程序员,都可以从中学到实用的知识~~
ThinkPHP是一个快速、开源的轻量级国产PHP开发框架,是业内最流行的PHP框架之一。本课程以博客系统为例,讲述如何使用TP实战开发,从中学习Thinkphp的实践应用。模版下载地址:http:/...
本课程是php实战开发课程,以爱奇艺电影网站为蓝本从零开发一个自己的网站。目的是让大家了解真实项目的架构及开发过程
本课以一个极简的PHP开发框架为案例,向您展示了一个PHP框架应该具有的基本功能,以及具体的实现方法,让您快速对PHP开发框架的底层实现有一个清楚的认识,为以后学习其实的开发框架打下坚实的基础。
javascript是运行在浏览器上的脚本语言,连续多年,被评为全球最受欢迎的编程语言。是前端开发必备三大法器中,最具杀伤力。如果前端开发是降龙十八掌,好么javascript就是第18掌:亢龙有悔。...
本站9月直播课已经结束,本套教程是直播实录,没有报上名或者漏听学员福利来了,赶紧看看吧,说不定这里就有你的菜
轻松明快,简洁生动,让你快速走入HTML5的世界,体会语义化开发的魅力
JavaScript能够称得上是史上使用最广泛的编程语言,也是前端开发必须掌握的三技能之一:描述网页内容的HTML、描述网页样式的CSS以及描述网页行为的JavaScript。本章节将帮助大家迅速掌握...
Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 WEB 项目。为所有开发者、所有应用场景而设计,它让前端开发更快速、简单,所有开发者都能快速上手...
《php用户注册登录系统》主要介绍网站的登录注册功能,我们会从最简单的实现登录注册功能开始,增加验证码,cookie验证等,丰富网站的登录注册功能
《php.cn独孤九贱(2)-css视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了CSS知识...
《PHP学生管理系统视频教程》主要给大家讲解了HTML,PHP,MySQL之间的相互协作,实现动态的网页显示和获取数据.
jQuery是一个快速、简洁的JavaScript框架。设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的...
《弹指间学会HTML视频教程》从最基本的概念开始讲起,步步深入,带领大家学习HTML,了解各种常用标签的意义以及基本用法,学习HTML知识为以后的学习打下基础
《最新微信小程序开发视频教程》本节课程是由微趋道录制,讲述了如何申请一个微信小程序,以及开发中需要使用哪些工具,和需要注意哪些等。
全栈工程师
文章总浏览数爬虫的自我解剖(抓取网页HtmlUnit)
网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit包,4行代码就OK啦,例子如下:
final WebClient webClient=new WebClient();
final HtmlPage page=webClient.getPage("http://www.yanyulin.info");
System.out.println(page.asText());
webClient.closeAllWindows();
在程序中写上上面的4行代码,运行,就可以得到首页的全部内容,上面代码在运行的过程中会出现很多警告,出现这些警告的主要原因是由于以下两点:
1、HtmlUnit对Javascript的支持不是很好
2、HtmlUnit对CSS的支持不是很好
明白了上面的两点后,将代码重新改写一下,该禁用的就禁用,同时禁用一些不必要的功能,也有利于提高程序的运行效率,再者说网络爬虫也不需要CSS的支持滴
final WebClient webClient=new WebClient();
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);
final HtmlPage page=webClient.getPage("http://www.yanyulin.info");
System.out.println(page.asText());
webClient.closeAllWindows();
HtmlUnit的使用: 简介:HtmlUnit说白了就是一个浏览器,这个浏览器是用Java写的无界面的浏览器,正因为其没有界面,因此执行的速度还是可以滴,HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单的填充,表单的提交,模仿点击链接,由于内置了Rhinojs引擎,因此可以执行Javascript
作用:web的自动化测试(最初的目的),浏览器,网络爬虫
重要API的使用 在介绍API的使用之前要先明白的一个问题是,WebClient,WebWindow,Page三者之间的关系,所有的页面最终都是在一个WebWindow对象里面,WebClient在创建时会自动的创建一个WebWindow对象,当调用getPage时会将新页面加载到WebWindow里,你可以理解成WebClient就是IE内核,WebWindow就是呈现页面的浏览器窗口,三者之间的关系图如下图所示:
1、模拟特定浏览器,也可以指定浏览器的相应版本(HtmlUnit最新版2.13现在可以模拟的浏览器有Chrome/FireFox/IE)
//模拟chorme浏览器,其他浏览器请修改BrowserVersion.后面
webClient=new WebClient(BrowserVersion.CHROME);
2、查找特定元素,通过get或者XPath可以从HtmlPage中获得特定的Html元素,如下例子
方法一,通过get方法获取
HtmlPage page=webClient.getPage("http://www.yanyulin.info");
//从[烟雨林博客]上获取标签hed的内容
HtmlDivision div=(HtmlDivision)page.getElementById("hed");
方法二,通过XPath获取,XPath通常用于无法通过Id搜索,或者需要更为复杂的搜索时,XPath的相关教程
//同样可以打印出hed的内容,//div中//表示搜索整个文档中的div,并将这些div
//放入list中,然后获取第一个div
final HtmlDivision div = (HtmlDivision) page.getByXPath("//div").get(0);
System.out.println(div.asXml());
3、代理服务器的配置,代理的配置很简单,只需要配置好地址,端口,用户名与密码即可
final WebClient webClient = new WebClient(BrowserVersion.CHROME, "http://127.0.0.1", 8087);
final DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
credentialsProvider.addCredentials("username", "password");
4、模拟表单的提交
//获取表单
final HtmlForm form = page.getFormByName("form");
//获取提交按扭
final HtmlSubmitInput button = form.getInputByName("submit");
//一会得输入的
final HtmlTextInput textField = form.getInputByName("userid");
textField.setValueAttribute("test");
//点击提交表单
final HtmlPage page = button.click();
API的使用就介绍到这,网络爬虫中主要目的就是获取页中所有的链接,代码如下:
java.util.List&HtmlAnchor& achList=page.getAnchors();
for(HtmlAnchor ach:achList){
System.out.println(ach.getHrefAttribute());
最后来个例子,HtmlUnit模拟浏览器登录小米网站帐户,程运运行的截图如下,红色方框表示登录成功跳转到下一个页面出现的帐号:
阅读(...) 评论() &

我要回帖

更多关于 html加载后执行js 的文章

 

随机推荐