网络java爬虫抓取网页链接应该怎么抓取调用JS函数的链接地址

问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
想写一个爬虫,但是需要抓去的的数据是js生成的,在源代码里看不到,要怎么才能抓到呢? 最好是用python
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
如果对抓取的性能没有什么要求的话, 尝试一下selenium或者watir吧.
web自动化测试脚本用好了可以做很多事情.
利用你的浏览器执行好js, 然后再从dom里面取数据.另外一个情况, 如果你知道js是通过ajax或者api取数据的, 直接去抓数据源, 得到的不是json就是xml, 然后处理数据吧
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
基于webkit的,写js就行。
用python调它,用起来很爽。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
对于JS生成的数据,你是没有办法获取的。除非直接遍历dom还是有可能……一种办法是可以考虑用userscript,获取数据然后post到服务器等就随你自己的喜欢了还有一种办法(假设是在win32),可以使用com组件调用IE然后获取动态生成的dom树,然后再做处理当年试过改firefox的程序来做这个,不过也很麻烦当然,你也可以用python什么自己实现一套浏览器和js引擎,那么这些数据肯定是你自己的了,不过还不如直接改或者用com组件但是你说的爬虫爬取js生成的,那是没有办法的:(不管怎么样,一定要实现dom树,要让js能执行,那么就相当于你要实现一套简单的浏览器了
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
可以试着用
获得 JS 执行后的 dom。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
目前认为比较好的一个方案是采用python+gtk+pywebkit,相当于基于webkit自己写一个定制的浏览器,这样可以在网页中插入自己的js,遍历dom等都是非常容易的。这个组合在ubuntu下还是非常容易搭建的。
sudo apt-get install python-gtk python-webkit,即可。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App
SegmentFault
一起探索更多未知查看: 2198|回复: 3
C#爬虫可不可以获取JS代码跳转后的URL
TA的每日心情难过前天&16:51签到天数: 2 天[LV.1]初来乍到
这里淘宝客商品的链接,它是先会302或者301定向到另外一个页面,然后再通过JS模拟人工点击的方式进入淘宝商品页面,它的人工模拟点击页面代码如下:
[HTML] 纯文本查看 复制代码&!DOCTYPE html PUBLIC &-//W3C//DTD XHTML 1.0 Transitional//EN& &http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&&
&html xmlns=&http://www.w3.org/1999/xhtml&&
&script type='text/javascript'&
function htmlspecialchars(str){
str = str.replace(/&/g, '&');
str = str.replace(/&/g, '&');
str = str.replace(/&/g, '&');
str = str.replace(/'/g, ''');
function bol(){
if (top.location != self.location) {
var qs = location.search.split(&?&)[location.search.split(&?&).length-1].split(&&&);
for (var i=0; i&qs. i++){
if (qs[i]!=&&) {
var tmpa = qs[i].split(&=&);
qso[tmpa[0]] = tmpa[1] ? tmpa[1] : &&;
var tu = unescape(qso.tu);
if (htmlspecialchars(tu).length != tu.length) {
if (qso.tu && (qso.tu.indexOf(&http%3A%2F%2Fs.%2F&)===0
|| qso.tu.indexOf(&http%3A%2F%2Fi.%2F&)===0
|| qso.tu.indexOf(&http%3A%2F%2Fs.%2F&)===0
|| qso.tu.indexOf(&http%3A%2F%%2F&)===0
|| qso.tu.indexOf(&http%3A%2F%%2F&)===0)) {
if (!window.attachEvent) {
document.write('&input style=&display:none& type=&button& id=&exe& value=&&&');
document.getElementById('exe').click();
document.write('&a style=&display:none& href=&'+unescape(qso.tu)+'& id=&exe&&&/a&');
document.getElementById('exe').click();
}//end of bol()
可在这个页面找不到要跳转到的下一个URL,但是用浏览器打开它的时候却又可以跳转,C#能不能在进入这个页面后,运行页面里的JS代码,然后获取到下一个URL地址?
该用户从未签到
这不行吧,js处理过的
该用户从未签到
解决了么?
TA的每日心情郁闷 14:27签到天数: 1 天[LV.1]初来乍到
跟我的差不多,没戏,我都蹲好久了,也没人知道
( 豫ICP备号-1)&&网络爬虫,使用NodeJs抓取RSS新闻
Node.js 是一个基于Chrome Script 运行时建立的一个平台, 用来方便地搭建快速的, 易于扩展的网络应用· Node.js 借助事件驱动, 非阻塞 I/O 模型变得轻量和高效, 非常适合 run across distributed devices
的 data-intensive 的实时应用·
提供RSS服务的站点超级多,百度、网易、新浪、虎嗅网 等等站点,基于java
c++ php的rss抓取网上很多,今天说说NodeJs抓取RSS信息,
使用NodeJs做网络爬虫,抓取RSS新闻。各站点编码格式不一样 GBK,UTF-8,ISO8859-1等等,所以需要进行编码,对国人来说UTF-8是最酷的。抓取多站点,然后保存到,充分利用javascript异步的特点,抓取速度超级快呀。
这个项目是为新闻android客户端实现的,以后我也会上传新闻客户端的。
本项目的源码托管在github:/kissliux/rssSpider
环境需求:
NodeJs(必须), 我的版本是0.10.24
mongodb(可选),或者等等其他数据库
编程工具:webStrom
第一步:新建nodejs项目,我一般建立express web项目
第二步: 在package.json文件添加依赖
"dependencies": {
"express": "3.4.8",
"ejs": "*",
"feedparser":"0.16.6",
"request":"2.33.0",
"iconv":"2.0.7",
"mongoose":"3.8.7",
"mongodb":"*"
执行以下代码,导入相关的文件到项目node_modules中:
npm install -d
基本准备工作完毕,可以动手了写代码了。RSS抓取,主要依赖于feedparser 库,github地址:/danmactough/node-feedparser
先配置下,需要抓取的站点信息。
建立一个rssSite.json文件
"channel":[
"from":"baidu",
"name":"civilnews",
"work":false,
//false 则不抓取
"title":"百度国内最新新闻",
"link":"/n?cmd=4&class=civilnews&tn=rss",
"typeId":1
"from":"netEase",
"name":"rss_gn",
"title":"网易最新新闻",
"link":"/special/00011K6L/rss_gn.xml",
"typeId":2
我要抓取的就是这两个站点,channel的值是一个对象数组,如果你需要多个站点,直接添加就行了。
引入相关的包,
var request = require('request')
, FeedParser = require('feedparser')
, rssSite = require('../config/rssSite.json')
, Iconv = require('iconv').I
需要遍历刚刚配置的channel,找到需要的url地址
var channels = rssSite.
channels.forEach(function(e,i){
if(e.work != false){
console.log("begin:"+ e.title);
fetch(e.link,e.typeId);
});work为false的站点,都不进行抓取。即黑名单吧,typeId是标识这个新闻是属于哪个栏目,社会,财经还是其他。
关键在于fetch函数,抓取和分析都在这里了。我先贴代码 再来解释
function fetch(feed,typeId) {
// Define our streams
var req = request(feed, {timeout: 10000, pool: false});
req.setMaxListeners(50);
// Some feeds do not response without user-agent and accept headers.
req.setHeader('user-agent', 'Mozilla/5.0 (M Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36')
.setHeader('accept', 'text/html,application/xhtml+xml');
var feedparser = new FeedParser();
// Define our handlers
req.on('error', done);
req.on('response', function(res) {
var stream = this
posts = new Array();
if (res.statusCode != 200) return this.emit('error', new Error('Bad status code'));
charset = getParams(res.headers['content-type'] || '').
if (!iconv && charset && !/utf-*8/i.test(charset)) {
iconv = new Iconv(charset, 'utf-8');
iconv.on('error', done);
stream = this.pipe(iconv);
} catch(err) {
this.emit('error', err);
stream.pipe(feedparser);
feedparser.on('error', done);
feedparser.on('end', function(err){
postService.savePost(posts);
//存到数据库
feedparser.on('readable', function() {
while (post = this.read()) {
posts.push(transToPost(post));//保存到对象数组
function transToPost(post){
var mPost = new Post({
title : post.title,
link : post.link,
description : post.description,
pubDate : post.pubDate,
source : post.source,
author : post.author,
typeId : typeId
1、关键函数: request(url,[option]); 这个是可以发送http请求的函数。 地址: /mikeal/request.git
var req = request(feed, {timeout: 10000, pool: false});
req 需要监听几个状态 response,error。请求发出后,会收到响应,有响应后,把接收到的数据进行拼接,拼接前需要进行编码转换。把非utf8的编码转换成utf8.这里利用到了库 ICONV。地址:/bnoordhuis/node-iconv
res.headers['content-type'].
这样获取你抓取站点的编码格式。
拼接前需要进行编码转换,当然这里用了高明点的作法,pipe管道
然后进行转换成我没可以操作的对象,这个时候需要feedparser出马了,
var feedparser = new FeedParser();
feedparse也监听几个状态 readable,end,error
readable的回调方法 一次会读到一条记录,每次读到一条记录 我就存到数组对象中。
所有数据读完会调用 end的回调函数。到此,站点抓取完成了。 还是多站点呀
第四步:存到数据库
数据全部存在了posts 的数组对象中,要怎么处理,任凭您发落了。存到mongoDB也就几行代码的事情。这里用到了mongoose库
当然mongodb库也是必须要的。 mongoose类似于baseDao的感觉
操作mongodb数据库非常方便。
先建立模式:
var mongoose = require('mongoose');
var PostSchema = new mongoose.Schema({
title:String,
link :String,
description :String,
pubDate :String,
source :String,
author :String,
typeId : Number
module.exports = PostS
再建立模型:
var mongoose = require('mongoose');
var PostSchema = require('../schemas/PostSchema');
var Post = mongoose.model('Post',PostSchema);
module.exports = P
OK,可以保存到数据库了,mongoDB好像不能批量插入, 我这里就循环了,如果title不存在 则插进入,不然会有重复的新闻
var Post = require('../model/Post');
function savePost(posts){
for(var i = 0 ;i<posts.i++){
var post = posts[i];
console.log(post.title||"");
Post.find({"title":post.title||""},function(err,r){ // 不存在,则插入
console.error(err.stack);
if(r == null){
post.save(function(err){
console.error(err.stack);
exports.savePost = saveP
到此新闻抓取结束,欢迎拍砖。
下一篇文章我会介绍“新闻http服务,mongodb分页实现”,当然继续使用nodejs
(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'网络爬虫多线程有关问题_网络爬虫定向抓取纵谈_网络爬虫怎么自动调用网页中的JS函数__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
网络爬虫多线程有关问题
网络爬虫定向抓取纵谈
网络爬虫怎么自动调用网页中的JS函数
网络爬虫多线程有关问题
网络爬虫多线程问题网络爬虫多线程的问题: 如果每个连接都使用一个新的socket连接,那么多个TCP连接http服务器是不是会使http服务器拒绝?如果不使用多线程又很慢,请有这方面经验的牛人指教,给个思路,谢谢!
------解决方案--------------------只爬一个服务器的话,那是可能会出问题。出问题的条件是:到这个服务器的并发连接已经达到65535个了------解决方案--------------------多个线程共享socket?
对端发来数据,A线程收一点,B线程收一点,怎么解析?加锁有什么用
网络爬虫定向抓取纵谈
网络爬虫定向抓取漫谈
网络爬虫(web crawler)又称为网络蜘蛛(web spider)是一段计算机程序,它从互联网上按照一定的逻辑和算法抓取和下载互联网的网页,是搜索引擎的一个重要组成部分。一般的爬虫从一部分start url开始,按照一定的策略开始爬取,爬取到的新的url在放入到爬取队列之中,然后进行新一轮的爬取,直到抓取完毕为止。
我们看一下crawler一般会遇到什么样的问题吧:
抓取的网页量很大
网页更新量也很大,一般的网站,比如新闻,电子商务网站,页面基本是实时更新的
大部分的网页都是动态的,多媒体,或者封闭的(facebook)
海量网页的存在就意味着在一定时间之内,抓取只能的抓取其中的一部分,因此需要定义清楚抓取的优先级;网页更新的频繁,也就意味着需要抓取最新的网页和保证链接的有效性,因此一个更有可能带来新网页的列表页显得尤为重要;对于新闻网站,新的网站一般出现在首页,或者在指定的分类网页,但是对于淘宝来说,商品的更新就很难估计了;动态网页怎么办呢?现在的网页大都有JS和AJAX,抓取已经不是简单的执行wget下载,现代的网页结构需要我们的爬虫更加智能,需要更灵活的应对网页的各种情况。
因此,对一个通用的爬虫个,我们要定义
抓取策略,那些网页是我们需要去下载的,那些是无需下载的,那些网页是我们优先下载的,定义清楚之后,能节省很多无谓的爬取
更新策略,监控列表页来发现新的页面;定期check页面是否过期等等
抽取策略,我们应该如何的从网页中抽取我们想要的内容,不仅仅包含最终的目标内容,还有下一步要抓取的url
抓取频率,我们需要合理的去下载一个网站,却又不失效率
使用URL的正则特征是一个简单但却很高效的模式;对于定向抓取,一般的网站的URL有一定的特征,比如可能仅仅关心 .html, .htm, .asp, .aspx, .php, .jsp, .jspx类型的网页;或者是如果可以得到目标网站的正则,则可以大大的降低抓取的数量;又或者我们无需关心某一类网页,比如我们不抓取下面的内容;仅仅需要抓取淘宝的商品页面(/item.htm?id=\d+ )。通过URL的正则能极大的降低抓取数量;
也可以通过网页的文本特征来确定;不过要复杂得多了,一般需要一定数量已知页面的训练集合,然后提取页面的文本特征,然后通过向量空间模型或者其其他基于主题词提取的模型计算目标网页和训练集网页的距离,决定是否是目标网页。
Freshness:表示抓取到的网页是否已经被修改
Age:表示抓取的网页过期的时间
对于更新来说,目标是让平均age时间越小,freshness越高;一般的更新策略有两种:定期批量更新和按更新周期更新;定期批量更新指对一批URL,按照失效时间定期去刷新,按周期更新指的是按照页面更新变化频率而修正是更新频率,一般来说,更新越频繁的网页更新也就越快。
抽取策略:
XPATH是一个简单直观,但是很有效的一个方案,XPATH能精准的定位网页的任意一个位置,意味着我们可以很精准的抽取页面上的任意位置,当面临很多网站的时候,当然配置XPATH就是一个很艰巨的任务,也许存在一个自适应的XPATH识别的方法。
在java下面,HtmlUnit是一个不错的解决方案,HtmlUnit是Junit 的扩展测试框架之一,该框架模拟浏览器的行为,开发者可以使用其提供的API对页面的元素进行操作,套用官方网站的话HtmlUnit“是Java程序的浏览器”。HtmlUnit支持HTTP,HTTPS,COOKIE,表单的POST和GET方法,能够对HTML文档进行包装,页面的各种元素都可以被当作对象进行调用,另外对JavaScript的支持也比较好。一般来说,HtmlUnit是在java环境下解决JS的很好的选择
WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应的是KDE的KHTML和KJS;目前比较主流的浏览器Google Chrome和Apple的safari,都是基于WebKit的内核写的。使用浏览器作为抓取能更好的模拟用户浏览的行为,能够天然的解决JS和AJAX等问题,问题可能就是性能是一个瓶颈,
同时开启N个线程抓取一个网站,相信很快就会被对方网站封掉;因此抓取的频率也很重要;抓取网站同时不对对方网站造成压力;在robot.txt协议里面定义Crawl-delay来确定抓取的频率也是一种网站的通用的做法,对于一般的抓取而言,10到20秒抓取一次是一个比较保险的频率,也有提出10*t的抓取间隔(t是download时间)比较合理
定向抓取的框架
通用抓取架构,如下图
多线程下载模块(Multi-threaded downloader)
该模块一般包含:
下载模块,下载网页,并应对一些web的一些错误,包括redirect等等
DNS解析模块,网页数量很多的时候,我们需要一个本地的DNS解析模块来维护domain到IP的映射
链接抽取模块,抽取下一步要抓取的链接(follow link)
调度模块(schedule)
调度模块是抓取系统的核心,调度模块从url队列里面选择一批url喂到下载模块下载;其中会涉及到
url调度,调度模块按照一定的策略,选取url进入抓取系统
url除重,一定时期之内已经抓取的网页,不再抓取
实例:使用开源的scrapy爬虫抓取B2C站点的商品
Scrapy(http://scrapy.org/)是基于Twisted的异步处理框架,纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便,现在我们以scrapy为例子,简单配置一个抓取商品的例子。
Scrapy的安装请参考 http://doc.scrapy.org/intro/install.html#intro-install
定义起始页面:
定义详情页,例如:/product.htm?id=\d+
执行scrapy startproject mycrawler,新建一个mycrawler的工程
在mycrawler/mycrawler/spiders目录下,写抓取的python代码:mycrawlerspider.py
from scrapy.selector import HtmlXPathSelector
from scrapy.spider import BaseSpider
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.utils.url import urljoin_rfc
from scrapy.http import Request
class MySpider(BaseSpider):
name = 'test'
allowed_domains = ['']
start_urls = [
download_delay = 10
def parse(self, response):
for link in SgmlLinkExtractor(allow=" product.htm\?id=\d+").extract_links(response):
yield Request(link.url,callback=self.parse_detail)
hxs = HtmlXPathSelector(response)
for url in hxs.select('//a/@href').extract():
self._urljoin(response,url)
#print url
yield Request(url, callback=self.parse)
def parse_detail(self, response):
hxs = HtmlXPathSelector(response)
what_u_want= hxs.select("/xpath/text()").extract()[0]
print 'url=',response.url, what_u_want.strip()
def _urljoin(self, response, url):
"""Helper to convert relative urls to absolute"""
return urljoin_rfc(response.url, url, response.encoding)
简单几步,我们就可以抓取得到一个站点想要的页面了,并且可以抽取指定xpath的内容。
一个简单的定向爬虫就搭建起来了,关键是一个能够大规模的分布式的爬虫可能是一个挑战,后续再进一步介绍如何在分布式环境进行大规模的抓取,以及抓取遇到的一些更为棘手的问题,see u
原文地址:/2011/01/an-introduction-to-crawler.html
如有版权问题请与原文作者联系
网络爬虫怎么自动调用网页中的JS函数
网络爬虫如何自动调用网页中的JS函数自己写了一个网络爬虫,用于抓取某个网页,但是这个网页的内容很多,通过JS分页.现在我只能抓取到第一页的内容.分析html代码,发现它其中有一个onclick函数,可用于翻页,请问能否在我的爬虫中自动调用这个onclick函数,我的爬虫是拿httpclient做的.------解决方案--------------------
直接分析它的js方法传了哪些参数,然后带上这些参数去请求页面也可以吧?
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:

我要回帖

更多关于 python 爬虫 抓取链接 的文章

 

随机推荐