c 抓取网页数据

c 抓取网页数据

完整解决方案:H5与Native交互之JSBridge技术

网站优化优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2022-09-24 17:10 • 来自相关话题

  完整解决方案:H5与Native交互之JSBridge技术
  许多做过混合开发的人都知道 Ionic 和 PhoneGap 等框架。这些框架在web的基础上包裹了一层Native,然后利用Bridge技术让js调用视频、位置、音频等功能。本文就是介绍Bridge这一层的交互原理。通过阅读本文,可以了解js、ios和android的底层通信原理,以及JSBridge的封装技术和调试方法。
  一、原则
  下面介绍IOS与Android和Javascript的底层交互原理
  IOS
  在解释原理之前,我们先来了解一下iOS的UIWebView组件。我们来看看苹果官方的介绍:
  您可以使用 UIWebView 类在您的应用程序中嵌入 Web 内容。为此,您只需创建一个 UIWebView 对象,将其附加到窗口,并向其发送加载 Web 内容的请求。您还可以使用该类在网页历史记录中前后移动,甚至可以通过编程方式设置一些网页内容属性。
  上面的意思是UIWebView是一个可以加载网页的对象,它具有浏览记录功能,加载的网页内容是可编程的。说白了,UIWebView 有一个类似浏览器的功能。我们可以用它来打开页面,做一些自定义的功能,比如让js调用某个方法来获取手机的GPS信息。
  但需要注意的是,Safari浏览器使用的浏览器控件和UIwebView组件并不相同,两者在性能上存在较大差距。幸运的是,苹果在发布 iOS8 时,添加了一个 WKWebView 组件。如果你的APP只考虑支持iOS8及以上,那么你可以使用这个新的浏览器控件。
  原生 UIWebView 类提供以下属性和方法
  属性:
  方法:
  Native(Objective-C 或 Swift)调用 Javascript 方法
  Native通过UIWebView组件的stringByEvaluatingJavaScriptFromString方法调用Javascript语言,返回js脚本的执行结果。
  // Swift
webview.stringByEvaluatingJavaScriptFromString("Math.random()")
// OC
[webView stringByEvaluatingJavaScriptFromString:@"Math.random();"];
  从上面的代码可以看出,它实际上是调用了窗口下的一个对象。如果我们想让native调用我们js写的方法,那么这个方法必须是window下可以访问的。但是从全局来看,我们只需要暴露一个JSBridge这样的对象就可以调用native,所以这里我们可以对native代码做一个简单的封装:
  //下面为伪代码
webview.setDataToJs(somedata);
webview.setDataToJs = function(data) {
webview.stringByEvaluatingJavaScriptFromString("JSBridge.trigger(event, data)")
}
  Javascript 调用本机(Objective-C 或 Swift)方法
  反过来,Javascript调用Native,没有现成的API可以直接使用,需要通过一些方法间接实现。 UIWebView有一个特点:所有在UIWebView发起的网络请求都可以通过delegate函数在Native层得到通知。这样,我们就可以在UIWebView中发起一个自定义的网络请求,通常是这样的格式:jsbridge://methodName?param1=value1&param2=value2
  所以在UIWebView的delegate函数中,只要找到以jsbridge://开头的地址,就不会加载内容,而是执行相应的调用逻辑。
  有两种方式发起这样的网络请求:1.通过localtion.href; 2. 通过 iframe;
  location.href有一个问题,就是如果我们连续多次修改window.location.href的值,Native层只能接收到最后一个请求,而之前的请求会被忽略。
  使用iframe方法,以唤起Native APP的分享组件为例,简单的闭包如下:
  var url = 'jsbridge://doAction?title=分享标题&desc=分享描述&link=http%3A%2F%2Fwww.baidu.com';
var iframe = document.createElement('iframe');
iframe.style.width = '1px';
iframe.style.height = '1px';
iframe.style.display = 'none';
iframe.src = url;
document.body.appendChild(iframe);
setTimeout(function() {
iframe.remove();
}, 100);
  然后Webview可以拦截请求,解析出对应的方法和参数。如以下代码所示:
  func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
print("shouldStartLoadWithRequest")
let url = request.URL
let scheme = url?.scheme
let method = url?.host
let query = url?.query

if url != nil && scheme == "jsbridge" {
print("scheme == \(scheme)")
print("method == \(method)")
print("query == \(query)")
switch method! {
case "getData":
self.getData()
case "putData":
self.putData()
case "gotoWebview":
self.gotoWebview()
case "gotoNative":
self.gotoNative()
case "doAction":
self.doAction()
case "configNative":
self.configNative()
default:
print("default")
}

return false
} else {
return true
}
}
  安卓
  在android中,native和js的通信方式与ios类似,android中也支持ios中的schema方式。
  javascript 调用原生方法
  目前android中调用native的方式有3种:
  1.使用shouldOverrideUrlLoading方法通过schema方法解析url协议。这个js的调用方式和ios一样,都是用iframe调用原生代码。
  2.通过将原生js代码直接注入webview页面,使用addJavascriptInterface方法实现。
  
  在android中的实现如下:
  class JSInterface {
@JavascriptInterface //注意这个代码一定要加上
public String getUserData() {
return "UserData";
}
}
webView.addJavascriptInterface(new JSInterface(), "AndroidJS");
  以上代码将AndroidJS对象注入到页面的window对象中。可以直接在js中调用
  alert(AndroidJS.getUserData()) //UserDate
  3.使用 prompt、console.log 和 alert 方法。这三个方法是js原生的,可以在android webview层重写。一般我们用prompt,因为这个在js里用的不多,和native交流的副作用也少。
  class YouzanWebChromeClient extends WebChromeClient {
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
// 这里就可以对js的prompt进行处理,通过result返回结果
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
}
}
  Native 调用 javascript 方法
  在android中,使用webview的loadUrl调用,如:
  // 调用js中的JSBridge.trigger方法
webView.loadUrl("javascript:JSBridge.trigger('webviewReady')");
  二、库的封装js调用原生封装
  上面我们了解了js和native通信的底层原理,所以我们可以封装一个基本的通信方法doCall来屏蔽android和ios的区别。
  YouzanJsBridge = {
doCall: function(functionName, data, callback) {
var _this = this;
// 解决连续调用问题
if (this.lastCallTime && (Date.now() - this.lastCallTime) < 100) {
setTimeout(function() {
_this.doCall(functionName, data, callback);
}, 100);
return;
}
this.lastCallTime = Date.now();

data = data || {};
if (callback) {
$.extend(data, { callback: callback });
}

if (UA.isIOS()) {
$.each(data, function(key, value) {
if ($.isPlainObject(value) || $.isArray(value)) {
data[key] = JSON.stringify(value);
}
});
var url = Args.addParameter('youzanjs://' + functionName, data);
var iframe = document.createElement('iframe');
iframe.style.width = '1px';
iframe.style.height = '1px';
iframe.style.display = 'none';
iframe.src = url;
document.body.appendChild(iframe);
setTimeout(function() {
iframe.remove();
}, 100);
} else if (UA.isAndroid()) {
window.androidJS && window.androidJS[functionName] && window.androidJS[functionName](JSON.stringify(data));
} else {
console.error('未获取platform信息,调取api失败');
}
}
}
  在android端,我们使用addJavascriptInterface方法注入了一个AndroidJS对象。
  项目常用方法抽象
  在项目的实践中,我们逐渐抽象出一些通用的方法,基本可以满足项目的需要。如下:
  1.getData(datatype, callback, extra) H5从Native APP获取数据
  使用场景:当H5需要从Native APP获取一些数据时,可以调用该方法。
  参数类型是否必填示例值说明
  数据类型
  字符串
  是的
  
  用户信息
  数据类型
  回调
  功能
  是的
  回调函数
  额外的
  对象
  没有
  传递给 Native APP 的数据对象
  示例代码:
  JSBridge.getData('userInfo',function(data) {
console.log(data);
});
  2.putData(datatype, data) H5告诉Native APP一些数据
  使用场景:H5告诉Native APP一些数据,可以调用这个方法。
  参数类型是否必填示例值说明
  数据类型
  字符串
  是的
  用户信息
  数据类型
  数据
  对象
  是的
  { 用户名:'zhangsan',年龄:20 }
  传递给 Native APP 的数据对象
  示例代码:
  JSBridge.putData('userInfo', {
username: 'zhangsan',
age: 20
});
  3.gotoWebview(url, page, data) 原生APP打开一个新的Webview窗口并打开对应的网页参数类型必填示例值说明
  网址
  字符串
  是的
  网页链接地址,一般只要传URL参数就可以了
  页面
  字符串
  没有
  网络
  网页类型,默认为web
  数据
  对象
  没有
  额外的参数对象
  示例代码:
  // 示例1:打开一个网页
JSBridge.gotoWebview('http://www.youzan.com');
// 示例2:打开一个网页,并且传递额外的参数给Native APP
JSBridge.gotoWebview('http://www.youzan.com', 'goodsDetail', {
goods_id: 10000,
title: '这是商品的标题',
desc: '这是商品的描述'
});
  4.gotoNative(page, data) 从H5页面跳转到Native APP类型的native接口参数必填示例值说明
  页面
  字符串
  是的
  登录页面
  本机页面标识符,例如 loginPage
  数据
  对象
  没有
  { 用户名:'zhangsan',年龄:20 }
  额外的参数对象
  示例代码:
  // 示例1:打开Native APP登录页面
JSBridge.gotoNative('loginPage');
// 示例2:打开Native APP登录页面,并且传递用户名给Native APP
JSBridge.gotoNative('loginPage', {
username: '张三'
});
  5.doAction(action, data) 函数上的一些动作参数 Type 是否必填 示例值 说明
  动作
  字符串
  是的
  复制
  核心方法:PHP如何使用curl实现数据抓取
  PHP如何使用curl实现数据抓取介绍如何使用curl实现数据抓取?以下是为您提供的实现代码。您可以参考代码以获取更多详细信息。代理服务器代理服务器地址httpwwwcnproxycomproxy1htmlHongKongChina的速度比较好 curl_setoptchCURLOPT_PROXYcu
  
  rl_setoptchCURLOPT_URLurlcurl_setoptchCURLOPT_RETURNTRANSFER1returndontprintcurl_setoptchCURLOPT_TIMEOUT30设置超时时间curl_setoptchCURLOPT_USERAGENTMozilla40compatibleMSIE501WindowsNT50curl_setoptchCURLOPT_FOLLOWLOCATION1302redirectcurl_setoptchCURLOPT_MAXREDIRS7HTTp定向级别curl_multi_add_handlemhch把curlresource放进multicurlhandler里handle[i]ch执行domrccurl_multi_execmhrunningifwait_usec0每个connect要间隔多久usleepwa
  
  it_usec250000025secwhilemrcCURLM_CALL_MULTI_PERFORMwhilerunningmrcCURLM_OKifcurl_multi_selectmh-1domrccurl_multi_execmhrunningwhilemrcCURLM_CALL_MULTI_PERFORM读取资料foreachhandleasichcontentcurl_multi_getcontentchdata[i]curl_errnoch0contentfalse移除handleforeachhandleaschcurl_multi_remove_handlemhchcurl_multi_closemhreturndataurlsarrayhttpmapbaiducomreasync_get_urlurlsechore[0] 查看全部

  完整解决方案:H5与Native交互之JSBridge技术
  许多做过混合开发的人都知道 Ionic 和 PhoneGap 等框架。这些框架在web的基础上包裹了一层Native,然后利用Bridge技术让js调用视频、位置、音频等功能。本文就是介绍Bridge这一层的交互原理。通过阅读本文,可以了解js、ios和android的底层通信原理,以及JSBridge的封装技术和调试方法。
  一、原则
  下面介绍IOS与Android和Javascript的底层交互原理
  IOS
  在解释原理之前,我们先来了解一下iOS的UIWebView组件。我们来看看苹果官方的介绍:
  您可以使用 UIWebView 类在您的应用程序中嵌入 Web 内容。为此,您只需创建一个 UIWebView 对象,将其附加到窗口,并向其发送加载 Web 内容的请求。您还可以使用该类在网页历史记录中前后移动,甚至可以通过编程方式设置一些网页内容属性。
  上面的意思是UIWebView是一个可以加载网页的对象,它具有浏览记录功能,加载的网页内容是可编程的。说白了,UIWebView 有一个类似浏览器的功能。我们可以用它来打开页面,做一些自定义的功能,比如让js调用某个方法来获取手机的GPS信息。
  但需要注意的是,Safari浏览器使用的浏览器控件和UIwebView组件并不相同,两者在性能上存在较大差距。幸运的是,苹果在发布 iOS8 时,添加了一个 WKWebView 组件。如果你的APP只考虑支持iOS8及以上,那么你可以使用这个新的浏览器控件。
  原生 UIWebView 类提供以下属性和方法
  属性:
  方法:
  Native(Objective-C 或 Swift)调用 Javascript 方法
  Native通过UIWebView组件的stringByEvaluatingJavaScriptFromString方法调用Javascript语言,返回js脚本的执行结果。
  // Swift
webview.stringByEvaluatingJavaScriptFromString("Math.random()")
// OC
[webView stringByEvaluatingJavaScriptFromString:@"Math.random();"];
  从上面的代码可以看出,它实际上是调用了窗口下的一个对象。如果我们想让native调用我们js写的方法,那么这个方法必须是window下可以访问的。但是从全局来看,我们只需要暴露一个JSBridge这样的对象就可以调用native,所以这里我们可以对native代码做一个简单的封装:
  //下面为伪代码
webview.setDataToJs(somedata);
webview.setDataToJs = function(data) {
webview.stringByEvaluatingJavaScriptFromString("JSBridge.trigger(event, data)")
}
  Javascript 调用本机(Objective-C 或 Swift)方法
  反过来,Javascript调用Native,没有现成的API可以直接使用,需要通过一些方法间接实现。 UIWebView有一个特点:所有在UIWebView发起的网络请求都可以通过delegate函数在Native层得到通知。这样,我们就可以在UIWebView中发起一个自定义的网络请求,通常是这样的格式:jsbridge://methodName?param1=value1&param2=value2
  所以在UIWebView的delegate函数中,只要找到以jsbridge://开头的地址,就不会加载内容,而是执行相应的调用逻辑。
  有两种方式发起这样的网络请求:1.通过localtion.href; 2. 通过 iframe;
  location.href有一个问题,就是如果我们连续多次修改window.location.href的值,Native层只能接收到最后一个请求,而之前的请求会被忽略。
  使用iframe方法,以唤起Native APP的分享组件为例,简单的闭包如下:
  var url = 'jsbridge://doAction?title=分享标题&desc=分享描述&link=http%3A%2F%2Fwww.baidu.com';
var iframe = document.createElement('iframe');
iframe.style.width = '1px';
iframe.style.height = '1px';
iframe.style.display = 'none';
iframe.src = url;
document.body.appendChild(iframe);
setTimeout(function() {
iframe.remove();
}, 100);
  然后Webview可以拦截请求,解析出对应的方法和参数。如以下代码所示:
  func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
print("shouldStartLoadWithRequest")
let url = request.URL
let scheme = url?.scheme
let method = url?.host
let query = url?.query

if url != nil && scheme == "jsbridge" {
print("scheme == \(scheme)")
print("method == \(method)")
print("query == \(query)")
switch method! {
case "getData":
self.getData()
case "putData":
self.putData()
case "gotoWebview":
self.gotoWebview()
case "gotoNative":
self.gotoNative()
case "doAction":
self.doAction()
case "configNative":
self.configNative()
default:
print("default")
}

return false
} else {
return true
}
}
  安卓
  在android中,native和js的通信方式与ios类似,android中也支持ios中的schema方式。
  javascript 调用原生方法
  目前android中调用native的方式有3种:
  1.使用shouldOverrideUrlLoading方法通过schema方法解析url协议。这个js的调用方式和ios一样,都是用iframe调用原生代码。
  2.通过将原生js代码直接注入webview页面,使用addJavascriptInterface方法实现。
  
  在android中的实现如下:
  class JSInterface {
@JavascriptInterface //注意这个代码一定要加上
public String getUserData() {
return "UserData";
}
}
webView.addJavascriptInterface(new JSInterface(), "AndroidJS");
  以上代码将AndroidJS对象注入到页面的window对象中。可以直接在js中调用
  alert(AndroidJS.getUserData()) //UserDate
  3.使用 prompt、console.log 和 alert 方法。这三个方法是js原生的,可以在android webview层重写。一般我们用prompt,因为这个在js里用的不多,和native交流的副作用也少。
  class YouzanWebChromeClient extends WebChromeClient {
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
// 这里就可以对js的prompt进行处理,通过result返回结果
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
}
}
  Native 调用 javascript 方法
  在android中,使用webview的loadUrl调用,如:
  // 调用js中的JSBridge.trigger方法
webView.loadUrl("javascript:JSBridge.trigger('webviewReady')");
  二、库的封装js调用原生封装
  上面我们了解了js和native通信的底层原理,所以我们可以封装一个基本的通信方法doCall来屏蔽android和ios的区别。
  YouzanJsBridge = {
doCall: function(functionName, data, callback) {
var _this = this;
// 解决连续调用问题
if (this.lastCallTime && (Date.now() - this.lastCallTime) < 100) {
setTimeout(function() {
_this.doCall(functionName, data, callback);
}, 100);
return;
}
this.lastCallTime = Date.now();

data = data || {};
if (callback) {
$.extend(data, { callback: callback });
}

if (UA.isIOS()) {
$.each(data, function(key, value) {
if ($.isPlainObject(value) || $.isArray(value)) {
data[key] = JSON.stringify(value);
}
});
var url = Args.addParameter('youzanjs://' + functionName, data);
var iframe = document.createElement('iframe');
iframe.style.width = '1px';
iframe.style.height = '1px';
iframe.style.display = 'none';
iframe.src = url;
document.body.appendChild(iframe);
setTimeout(function() {
iframe.remove();
}, 100);
} else if (UA.isAndroid()) {
window.androidJS && window.androidJS[functionName] && window.androidJS[functionName](JSON.stringify(data));
} else {
console.error('未获取platform信息,调取api失败');
}
}
}
  在android端,我们使用addJavascriptInterface方法注入了一个AndroidJS对象。
  项目常用方法抽象
  在项目的实践中,我们逐渐抽象出一些通用的方法,基本可以满足项目的需要。如下:
  1.getData(datatype, callback, extra) H5从Native APP获取数据
  使用场景:当H5需要从Native APP获取一些数据时,可以调用该方法。
  参数类型是否必填示例值说明
  数据类型
  字符串
  是的
  
  用户信息
  数据类型
  回调
  功能
  是的
  回调函数
  额外的
  对象
  没有
  传递给 Native APP 的数据对象
  示例代码:
  JSBridge.getData('userInfo',function(data) {
console.log(data);
});
  2.putData(datatype, data) H5告诉Native APP一些数据
  使用场景:H5告诉Native APP一些数据,可以调用这个方法。
  参数类型是否必填示例值说明
  数据类型
  字符串
  是的
  用户信息
  数据类型
  数据
  对象
  是的
  { 用户名:'zhangsan',年龄:20 }
  传递给 Native APP 的数据对象
  示例代码:
  JSBridge.putData('userInfo', {
username: 'zhangsan',
age: 20
});
  3.gotoWebview(url, page, data) 原生APP打开一个新的Webview窗口并打开对应的网页参数类型必填示例值说明
  网址
  字符串
  是的
  网页链接地址,一般只要传URL参数就可以了
  页面
  字符串
  没有
  网络
  网页类型,默认为web
  数据
  对象
  没有
  额外的参数对象
  示例代码:
  // 示例1:打开一个网页
JSBridge.gotoWebview('http://www.youzan.com');
// 示例2:打开一个网页,并且传递额外的参数给Native APP
JSBridge.gotoWebview('http://www.youzan.com', 'goodsDetail', {
goods_id: 10000,
title: '这是商品的标题',
desc: '这是商品的描述'
});
  4.gotoNative(page, data) 从H5页面跳转到Native APP类型的native接口参数必填示例值说明
  页面
  字符串
  是的
  登录页面
  本机页面标识符,例如 loginPage
  数据
  对象
  没有
  { 用户名:'zhangsan',年龄:20 }
  额外的参数对象
  示例代码:
  // 示例1:打开Native APP登录页面
JSBridge.gotoNative('loginPage');
// 示例2:打开Native APP登录页面,并且传递用户名给Native APP
JSBridge.gotoNative('loginPage', {
username: '张三'
});
  5.doAction(action, data) 函数上的一些动作参数 Type 是否必填 示例值 说明
  动作
  字符串
  是的
  复制
  核心方法:PHP如何使用curl实现数据抓取
  PHP如何使用curl实现数据抓取介绍如何使用curl实现数据抓取?以下是为您提供的实现代码。您可以参考代码以获取更多详细信息。代理服务器代理服务器地址httpwwwcnproxycomproxy1htmlHongKongChina的速度比较好 curl_setoptchCURLOPT_PROXYcu
  
  rl_setoptchCURLOPT_URLurlcurl_setoptchCURLOPT_RETURNTRANSFER1returndontprintcurl_setoptchCURLOPT_TIMEOUT30设置超时时间curl_setoptchCURLOPT_USERAGENTMozilla40compatibleMSIE501WindowsNT50curl_setoptchCURLOPT_FOLLOWLOCATION1302redirectcurl_setoptchCURLOPT_MAXREDIRS7HTTp定向级别curl_multi_add_handlemhch把curlresource放进multicurlhandler里handle[i]ch执行domrccurl_multi_execmhrunningifwait_usec0每个connect要间隔多久usleepwa
  
  it_usec250000025secwhilemrcCURLM_CALL_MULTI_PERFORMwhilerunningmrcCURLM_OKifcurl_multi_selectmh-1domrccurl_multi_execmhrunningwhilemrcCURLM_CALL_MULTI_PERFORM读取资料foreachhandleasichcontentcurl_multi_getcontentchdata[i]curl_errnoch0contentfalse移除handleforeachhandleaschcurl_multi_remove_handlemhchcurl_multi_closemhreturndataurlsarrayhttpmapbaiducomreasync_get_urlurlsechore[0]

推荐文章:R从网页抓取到文本分析全教程:影评的获取与分析

网站优化优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2022-09-23 20:16 • 来自相关话题

  推荐文章:R从网页抓取到文本分析全教程:影评的获取与分析
  本期目录
  01
  网页抓取
  02
  中文分词
  03
  文档矩阵
  04
  词频同现
  05
  文本聚类
  06
  主题建模
  07
  情绪分析
  08
  词频统计
  09
  画一个词云
  输入
  随着科技的进步,定量分析的方法不再只通过问卷、二手数据库等方式采集数据,也不再只通过数理统计、回归分析等手段分析数据。针对不同的研究需求,产生了越来越多的新方法和新工具:
  例如以元胞自动机为代表的活体建模技术,以马尔可夫链蒙特卡罗(MCMC)算法为代表的计算机模拟技术等
  本期介绍一个使用爬虫技术爬取网页的实际案例,并对获取的网页文本数据进行后续分析。我将用网友对《流浪地球》豆瓣影评文的获取和分析的全过程作为示范案例。
  文本挖掘的本质是通过自然语言处理(NLP)和分析方法将文本转化为数据进行分析。所以阅读这篇文章需要一定的知识基础,包括网页设计、自然语言处理方法等,我会在文章中适当补充。
  ➡ 1.准备工作
  在分析工作之前,需要对软件的工作环境进行配置,包括设置工作目录、调用需要的包等。采集@收到的文本数据、各种字典、输出结果等> 将保存在工作目录中;首次使用前需要安装外部包。
  ### 准备工作# 设置工作目录setwd('D:/The Wandering Earth')# 加载所需程序包library('rvest')library('stringr')library('jiebaRD')library('jiebaR')library('plyr')library('rJava')library('tm')library('tmcn')library('proxy')library('topicmodels')library('sqldf')library('wordcloud2')
  ➡ 2.网页抓取
  我还是按照定量分析的传统套路,将整个分析过程分为数据采集和数据分析两部分。第一步是通过爬虫技术对网页进行爬取。
  网络爬虫,也称为蜘蛛,是一种自动浏览万维网的网络机器人。它的目的通常是编译一个网络索引。爬虫访问网站的过程会消耗目标系统的资源,很多网络系统默认是不允许爬虫工作的。因此,在访问大量页面时,爬虫需要考虑规划、负载和“礼貌”。不愿被爬虫访问且为爬虫所有者所知的公共网站,可以使用robots.txt文件等方式避免访问。
  例如豆瓣电影()的robots.txt如下:
  User-agent: *Disallow: /subject_searchDisallow: /amazon_searchDisallow: /searchDisallow: /group/searchDisallow: /event/searchDisallow: /celebrities/searchDisallow: /location/drama/searchDisallow: /forum/Disallow: /new_subjectDisallow: /service/iframeDisallow: /j/Disallow: /link2/Disallow: /recommend/Disallow: /doubanapp/cardDisallow: /update/topic/Sitemap: https://www.douban.com/sitemap_index.xmlSitemap: https://www.douban.com/sitemap_updated_index.xml# Crawl-delay: 5<br />User-agent: Wandoujia SpiderDisallow: /
  
  在实际应用中,网络爬虫技术并不是特别复杂。在许多情况下,我们倾向于指定网站 并爬取内容,更喜欢网页采集@> 而不是网络爬虫。在此之前,希望读者对网页的源码有所了解,尤其是标记语言(HTML,只有语法,没有变量和逻辑)、Cascading Style Sheets(CSS,用来控制元素的呈现)、脚本语言(JavaScript),网页设计中添加、删除、修改元素的作用)。
  另外,当网页有比较复杂的表现形式,比如URL分页、超链接、异步加载等,读者需要有更多的理论知识。
<p>### 网页采集# 观察网址规律index 查看全部

  推荐文章:R从网页抓取到文本分析全教程:影评的获取与分析
  本期目录
  01
  网页抓取
  02
  中文分词
  03
  文档矩阵
  04
  词频同现
  05
  文本聚类
  06
  主题建模
  07
  情绪分析
  08
  词频统计
  09
  画一个词云
  输入
  随着科技的进步,定量分析的方法不再只通过问卷、二手数据库等方式采集数据,也不再只通过数理统计、回归分析等手段分析数据。针对不同的研究需求,产生了越来越多的新方法和新工具:
  例如以元胞自动机为代表的活体建模技术,以马尔可夫链蒙特卡罗(MCMC)算法为代表的计算机模拟技术等
  本期介绍一个使用爬虫技术爬取网页的实际案例,并对获取的网页文本数据进行后续分析。我将用网友对《流浪地球》豆瓣影评文的获取和分析的全过程作为示范案例。
  文本挖掘的本质是通过自然语言处理(NLP)和分析方法将文本转化为数据进行分析。所以阅读这篇文章需要一定的知识基础,包括网页设计、自然语言处理方法等,我会在文章中适当补充。
  ➡ 1.准备工作
  在分析工作之前,需要对软件的工作环境进行配置,包括设置工作目录、调用需要的包等。采集@收到的文本数据、各种字典、输出结果等> 将保存在工作目录中;首次使用前需要安装外部包。
  ### 准备工作# 设置工作目录setwd('D:/The Wandering Earth')# 加载所需程序包library('rvest')library('stringr')library('jiebaRD')library('jiebaR')library('plyr')library('rJava')library('tm')library('tmcn')library('proxy')library('topicmodels')library('sqldf')library('wordcloud2')
  ➡ 2.网页抓取
  我还是按照定量分析的传统套路,将整个分析过程分为数据采集和数据分析两部分。第一步是通过爬虫技术对网页进行爬取。
  网络爬虫,也称为蜘蛛,是一种自动浏览万维网的网络机器人。它的目的通常是编译一个网络索引。爬虫访问网站的过程会消耗目标系统的资源,很多网络系统默认是不允许爬虫工作的。因此,在访问大量页面时,爬虫需要考虑规划、负载和“礼貌”。不愿被爬虫访问且为爬虫所有者所知的公共网站,可以使用robots.txt文件等方式避免访问。
  例如豆瓣电影()的robots.txt如下:
  User-agent: *Disallow: /subject_searchDisallow: /amazon_searchDisallow: /searchDisallow: /group/searchDisallow: /event/searchDisallow: /celebrities/searchDisallow: /location/drama/searchDisallow: /forum/Disallow: /new_subjectDisallow: /service/iframeDisallow: /j/Disallow: /link2/Disallow: /recommend/Disallow: /doubanapp/cardDisallow: /update/topic/Sitemap: https://www.douban.com/sitemap_index.xmlSitemap: https://www.douban.com/sitemap_updated_index.xml# Crawl-delay: 5<br />User-agent: Wandoujia SpiderDisallow: /
  
  在实际应用中,网络爬虫技术并不是特别复杂。在许多情况下,我们倾向于指定网站 并爬取内容,更喜欢网页采集@> 而不是网络爬虫。在此之前,希望读者对网页的源码有所了解,尤其是标记语言(HTML,只有语法,没有变量和逻辑)、Cascading Style Sheets(CSS,用来控制元素的呈现)、脚本语言(JavaScript),网页设计中添加、删除、修改元素的作用)。
  另外,当网页有比较复杂的表现形式,比如URL分页、超链接、异步加载等,读者需要有更多的理论知识。
<p>### 网页采集# 观察网址规律index

使用Python爬取知乎回答数据

网站优化优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2022-09-20 19:48 • 来自相关话题

  使用Python爬取知乎回答数据
  import os<br />import json<br />import requests<br />import pandas as pd<br />from bs4 import BeautifulSoup<br /><br />def fetch(next_url):<br /> url = next_url<br /> headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',<br /> 'cookie':' Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1662619350,1662729414,1662813326,1662863065; NOT_UNREGISTER_WAITING=1; __snaker__id=aaLaUJhoCrcgia6P; gdxidpyhxdE=Z4jGxmeqi1HC5PnRKj\d3E\WEnEWkBkK1tpmdQvu6RzwHwXylDsE+fs\tvockccCr9Ab6avhglhdOzLT\37694bL5J\VW\yScB768crPnDtUt85ocmNzD51Wy8UNl69wsyb4y9jyNuGA/izfp+zEJNN/JPhjfJswkP5CMloiLtCgJ/BJ:1662864511703; YD00517437729195:WM_NI=tGzooxLbrz3g7PifRTCu05vFcH+zU5/vTlFvj5KWyGYr0fduFLvW/GVno0Jg90xvhQeo4+fIpjSV6+9EjI78CyP2DCG4X2g9mK1yoKuKeSnqQCh223jYOC/epIZ9YLXZem0=; YD00517437729195:WM_NIKE=9ca17ae2e6ffcda170e2e6ee9bc83c8d9987b9d35aa6ef8fa2c44a938a8a82d54da5a68387c77087e9e1d5f22af0fea7c3b92ab899b690ee7490bebe9bb26df590a787d16081ab00d6f54ea198e59bd83fedaa9c8dc57eaaeb85b8fc4d9bae0087e77f8694bab8ae4d96b2a1d1c96dfbf0b897eb5ba7b1fccce543b4b69db7b521fb9ba6aab63481a7a0d3c74985ec98d3e633af95ff9aee41b795abb4ed7b939da8d3b139aa8781a4ae6fb49796dadc489c86ab8eb337e2a3; captcha_session_v2=2|1:0|10:1662863756|18:captcha_session_v2|88:ZjZEdWhuanlMNHlZOEMzUURLUExmNHVHTkVpTVE5N2pScG5uR3M2blJwbktmc201MWk5Z3FpSTNyVUR2U1gzZg==|58304cc84b91db866170982c9f5431c528f986d61abb523a0b4839a5a1a8c2e2; captcha_ticket_v2=2|1:0|10:1662863773|17:captcha_ticket_v2|704:eyJ2YWxpZGF0ZSI6IkNOMzFfN3RlRWpGVEhJU1dfbzRQZkt6R3dieVhsbWltQTlyMjJSMndXblNsVDJvUGR0Z1VzMERWSG8wMm9ZUUdtNzFoYy0wLWJFMFZ4aXhUNDlKVEx6MUFTbXlwTVpsMC5QU2xzWERmencyYS0uVnBwUDZFQ2F4b3RJLmZhT1lDbkQwV3ZCMlNpRE9mcHVrTExibFExMURtbXpFRU16Ni5GR21lWXBOcTdoX1NSY0hfVndQcFpqVWh5VUQtc05EYlVBdFJZWWQuc1ZyUk5IOXRqWV9DMXRLb1FFLjE5SFVoQ2hDcmQ1YjFjbWlUMEVWV094VlZtUHNYc1BjZk5hdERCaXhYQjA3bDVlUm92Wi1kR3NjbERDOFFpTDFVZ3gxaDdmYVZlOC5zbEx2WHBiQkR2OFVpcTg5T2VyLi1pbFRUOFRpS284dzVrQW1DRVBtMEs0bTlzTXFBQUtpd0dVbjFJSHdRam1kWHc5Mi5xMDBfOXdxOUVJUHJkdWZWbGVRdjZOVUlTNDJ4eWNyc0ZVbENJdDJJU3g5WTJEdWlwc01PUy4yRVo0WXN0QUVZMTh6MWU4RjZZNGJwTi02Y3dPQVIuT2pyZlpkSlVJdWk5c2JWMFJBOXUySGFZNDd5c2t6YjZhUGNTck9tdy5OeHJsa2wuX1Bub3Z0cll5MXk2eTFTMyJ9|a16af6aa89bcea98828d64565d9f7533d1555fede7f5af4ef6f4df2863fcda08; z_c0=2|1:0|10:1662863925|4:z_c0|92:Mi4xbzBfSlBRQUFBQUFBNE5EalpCUHdFU1lBQUFCZ0FsVk5OWmdLWkFCUkdXeWVqVUhRODU5bVRmaVRIRXl2VEJ5MWdB|4191bc8e9a3b0f620ddc0a499e3de9588e5437ed744448a779c0ddc3fc7d3aa1; tst=r; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1662864218; KLBRSID=975d56862ba86eb589d21e89c8d1e74e|1662864248|1662863060'}<br /><br /> res = requests.get(url, headers=headers)<br /> return res.json()<br /># y = fetch()<br /># print(y)<br />def parse(y):<br /> data = y['data'] #data = y['data']= res.json()['data']<br /> next_url = y['paging']['next']<br /> comment_all = []<br /> for item in data:<br /> author = item['target']['author']['name']<br /> content = item['target']['excerpt']<br /> comment_data = [author, content]<br /> comment_all.append(comment_data)<br /> return comment_all, next_url<br />def save(data, path, filename):<br /><br /> if not os.path.exists(path):<br /> os.makedirs(path)<br /> df = pd.DataFrame(data)<br /> df.to_csv(path+filename, encoding='utf_8_sig', mode='a', index=False, sep=',', header=False)<br /><br />if __name__ == '__main__':<br /> next_url = 'https://www.zhihu.com/api/v4/questions/63014725/feeds?cursor=e3cd4f087b3e3cd07c3325d6c31d961b&include=data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,collapsed_by,suggest_edit,comment_count,can_comment,content,editable_content,attachment,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,relevant_info,question,excerpt,is_labeled,paid_info,paid_info_content,reaction_instruction,relationship.is_authorized,is_author,voting,is_thanked,is_nothelp,is_recognized;data[*].mark_infos[*].url;data[*].author.follower_count,vip_info,badge[*].topics;data[*].settings.table_of_content.enabled&limit=5&offset=0&order=default&platform=desktop&session_id=1662864215041635408'<br /> path = 'F:/知乎/'<br /> filename = 'zhihu.csv'<br /> csvHeader =[['用户昵称', '评论内容']]<br /> save(csvHeader, path, filename)#csvheader在这里代替了data被写入到了pd.DateFrame()<br /> while(True):<br /> y = fetch(next_url)<br /> comment_all, next_url = parse(y)<br /> save(comment_all, path, filename)<br /> if next_url == 0:<br /> break<br />
  注意点:
  ①要在headers里面添加cookie,否则返回的是一个空的json数据,建议使用小号的cookie,否则被封号后果自负啊 [狗头.jpg]。
  ②既往的爬取知乎数据的代码主要是利用offset这个偏移量,不过目前它不再变化了。观察Request URL的规律,发现它多了一个变化的cursor参数,而这个cursor参数就是我们的突破口。在抓取的数据包中,我们在['paging']['next']中找到了下一个数据包的网址,我们只需要把下一页的网址不断传入fetch()函数中就可以不断的获取数据包,然后通过获取到的数据包解析我们需要的内容和下一页的url,然后不断循环就能实现爬取答案的目的。
  ③在提取内容时,一个是content,一个是excerpt,excerpt是摘录的意思,内容并不完整,但目前提取content老是报错,我也不知道为啥hhh
  ④退出循环的条件可能并不满足,不过代码还在跑,跑到最后它自己就报错退出了,我觉得不影响使用就没管它hhh
  昨天发了一篇关于微博的推文,不过没看到推送,今天再发一遍。
  import os<br />import json<br />import requests<br />import pandas as pd<br />from bs4 import BeautifulSoup<br />def fetch(max_id):<br /> url = 'https://weibo.com/ajax/statuses/buildComments'<br /> headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'}<br /> params = {'flow': 0,<br /> 'is_reload': 1,<br /> 'id': 4811924297221505,<br /> 'is_show_bulletin': 2,<br /> 'is_mix': 0,<br /> 'max_id': max_id,<br /> 'count': 20,<br /> 'uid': 2803301701}<br /> res = requests.get(url, headers=headers, params=params)<br /> return res.json()<br /># y = fetch()<br /># print(y)<br />def parse(y): #y = fetch()=res.json()<br /> data = y['data'] #y['data']=res.json()['data']<br /> max_id = y['max_id']<br /> comment_all = []<br /> for item in data:<br /> name = item['user']['screen_name']<br /> content = BeautifulSoup(item['text'], 'html.parser').text<br /> date = item['created_at']<br /> likes = item['like_counts']<br /> ip = item['user']['location']<br /> comment_data = [name, content, date, likes, ip]<br /> comment_all.append(comment_data)<br /> return comment_all, max_id<br />def save(data, path, filename):<br /><br /> if not os.path.exists(path):<br /> os.makedirs(path)<br /> df = pd.DataFrame(data)#data参数<br /> df.to_csv(path+filename, encoding='utf_8_sig', mode='a', index=False, sep=',', header=False)<br /><br />if __name__ == '__main__':#注意是两个==<br /> max_id = 0<br /> path = 'F:/微博/'<br /> filename = 'weibo.csv'<br /> csvHeader = [['用户昵称', '评论内容', '评论时间', '被点赞数', '所在城市']]<br /> save(csvHeader, path, filename)#csvheader在这里代替了data被写入了pd.DateFrame()<br /> while(True):<br /> y = fetch(max_id)<br /> comment_all, max_id = parse(y)<br /> save(comment_all, path, filename)<br /> if max_id == 0:<br /> break<br />
  大体思路:
  
  分析网址构造——获取网页数据——解析数据——存储数据。
  ①分析网址构造:
  静态的还是动态的?
  规律:先翻页,后抓包。xhr还是doc?
  微博评论是Ajax动态渲染出来的。
  如何应对Ajax?
  发现请求头的规律,构造函数,伪装成浏览器给服务器发送请求以获得数据。
  ②获得网页数据
  Requests URL 自“?”之后皆为参数,将其写入params中。
  Request Method为get,
  
  使用requests()函数以获取数据,并将返回的函数res.json()
  ③解析数据
  寻找需要的数据,然后遍历,并保存到列表中。
  ④保存数据
  使用dateframe生成一个csv文件,并先行设置好csv的header,当max_id = 0 时退出循环。
  详细内容参见【机灵鹤】公众号,这个博主超赞的!!!
  最后看看结果:
  知乎的↓
  微博的↓ 查看全部

  使用Python爬取知乎回答数据
  import os<br />import json<br />import requests<br />import pandas as pd<br />from bs4 import BeautifulSoup<br /><br />def fetch(next_url):<br /> url = next_url<br /> headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',<br /> 'cookie':' Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1662619350,1662729414,1662813326,1662863065; NOT_UNREGISTER_WAITING=1; __snaker__id=aaLaUJhoCrcgia6P; gdxidpyhxdE=Z4jGxmeqi1HC5PnRKj\d3E\WEnEWkBkK1tpmdQvu6RzwHwXylDsE+fs\tvockccCr9Ab6avhglhdOzLT\37694bL5J\VW\yScB768crPnDtUt85ocmNzD51Wy8UNl69wsyb4y9jyNuGA/izfp+zEJNN/JPhjfJswkP5CMloiLtCgJ/BJ:1662864511703; YD00517437729195:WM_NI=tGzooxLbrz3g7PifRTCu05vFcH+zU5/vTlFvj5KWyGYr0fduFLvW/GVno0Jg90xvhQeo4+fIpjSV6+9EjI78CyP2DCG4X2g9mK1yoKuKeSnqQCh223jYOC/epIZ9YLXZem0=; YD00517437729195:WM_NIKE=9ca17ae2e6ffcda170e2e6ee9bc83c8d9987b9d35aa6ef8fa2c44a938a8a82d54da5a68387c77087e9e1d5f22af0fea7c3b92ab899b690ee7490bebe9bb26df590a787d16081ab00d6f54ea198e59bd83fedaa9c8dc57eaaeb85b8fc4d9bae0087e77f8694bab8ae4d96b2a1d1c96dfbf0b897eb5ba7b1fccce543b4b69db7b521fb9ba6aab63481a7a0d3c74985ec98d3e633af95ff9aee41b795abb4ed7b939da8d3b139aa8781a4ae6fb49796dadc489c86ab8eb337e2a3; captcha_session_v2=2|1:0|10:1662863756|18:captcha_session_v2|88:ZjZEdWhuanlMNHlZOEMzUURLUExmNHVHTkVpTVE5N2pScG5uR3M2blJwbktmc201MWk5Z3FpSTNyVUR2U1gzZg==|58304cc84b91db866170982c9f5431c528f986d61abb523a0b4839a5a1a8c2e2; captcha_ticket_v2=2|1:0|10:1662863773|17:captcha_ticket_v2|704:eyJ2YWxpZGF0ZSI6IkNOMzFfN3RlRWpGVEhJU1dfbzRQZkt6R3dieVhsbWltQTlyMjJSMndXblNsVDJvUGR0Z1VzMERWSG8wMm9ZUUdtNzFoYy0wLWJFMFZ4aXhUNDlKVEx6MUFTbXlwTVpsMC5QU2xzWERmencyYS0uVnBwUDZFQ2F4b3RJLmZhT1lDbkQwV3ZCMlNpRE9mcHVrTExibFExMURtbXpFRU16Ni5GR21lWXBOcTdoX1NSY0hfVndQcFpqVWh5VUQtc05EYlVBdFJZWWQuc1ZyUk5IOXRqWV9DMXRLb1FFLjE5SFVoQ2hDcmQ1YjFjbWlUMEVWV094VlZtUHNYc1BjZk5hdERCaXhYQjA3bDVlUm92Wi1kR3NjbERDOFFpTDFVZ3gxaDdmYVZlOC5zbEx2WHBiQkR2OFVpcTg5T2VyLi1pbFRUOFRpS284dzVrQW1DRVBtMEs0bTlzTXFBQUtpd0dVbjFJSHdRam1kWHc5Mi5xMDBfOXdxOUVJUHJkdWZWbGVRdjZOVUlTNDJ4eWNyc0ZVbENJdDJJU3g5WTJEdWlwc01PUy4yRVo0WXN0QUVZMTh6MWU4RjZZNGJwTi02Y3dPQVIuT2pyZlpkSlVJdWk5c2JWMFJBOXUySGFZNDd5c2t6YjZhUGNTck9tdy5OeHJsa2wuX1Bub3Z0cll5MXk2eTFTMyJ9|a16af6aa89bcea98828d64565d9f7533d1555fede7f5af4ef6f4df2863fcda08; z_c0=2|1:0|10:1662863925|4:z_c0|92:Mi4xbzBfSlBRQUFBQUFBNE5EalpCUHdFU1lBQUFCZ0FsVk5OWmdLWkFCUkdXeWVqVUhRODU5bVRmaVRIRXl2VEJ5MWdB|4191bc8e9a3b0f620ddc0a499e3de9588e5437ed744448a779c0ddc3fc7d3aa1; tst=r; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1662864218; KLBRSID=975d56862ba86eb589d21e89c8d1e74e|1662864248|1662863060'}<br /><br /> res = requests.get(url, headers=headers)<br /> return res.json()<br /># y = fetch()<br /># print(y)<br />def parse(y):<br /> data = y['data'] #data = y['data']= res.json()['data']<br /> next_url = y['paging']['next']<br /> comment_all = []<br /> for item in data:<br /> author = item['target']['author']['name']<br /> content = item['target']['excerpt']<br /> comment_data = [author, content]<br /> comment_all.append(comment_data)<br /> return comment_all, next_url<br />def save(data, path, filename):<br /><br /> if not os.path.exists(path):<br /> os.makedirs(path)<br /> df = pd.DataFrame(data)<br /> df.to_csv(path+filename, encoding='utf_8_sig', mode='a', index=False, sep=',', header=False)<br /><br />if __name__ == '__main__':<br /> next_url = 'https://www.zhihu.com/api/v4/questions/63014725/feeds?cursor=e3cd4f087b3e3cd07c3325d6c31d961b&include=data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,collapsed_by,suggest_edit,comment_count,can_comment,content,editable_content,attachment,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,relevant_info,question,excerpt,is_labeled,paid_info,paid_info_content,reaction_instruction,relationship.is_authorized,is_author,voting,is_thanked,is_nothelp,is_recognized;data[*].mark_infos[*].url;data[*].author.follower_count,vip_info,badge[*].topics;data[*].settings.table_of_content.enabled&limit=5&offset=0&order=default&platform=desktop&session_id=1662864215041635408'<br /> path = 'F:/知乎/'<br /> filename = 'zhihu.csv'<br /> csvHeader =[['用户昵称', '评论内容']]<br /> save(csvHeader, path, filename)#csvheader在这里代替了data被写入到了pd.DateFrame()<br /> while(True):<br /> y = fetch(next_url)<br /> comment_all, next_url = parse(y)<br /> save(comment_all, path, filename)<br /> if next_url == 0:<br /> break<br />
  注意点:
  ①要在headers里面添加cookie,否则返回的是一个空的json数据,建议使用小号的cookie,否则被封号后果自负啊 [狗头.jpg]。
  ②既往的爬取知乎数据的代码主要是利用offset这个偏移量,不过目前它不再变化了。观察Request URL的规律,发现它多了一个变化的cursor参数,而这个cursor参数就是我们的突破口。在抓取的数据包中,我们在['paging']['next']中找到了下一个数据包的网址,我们只需要把下一页的网址不断传入fetch()函数中就可以不断的获取数据包,然后通过获取到的数据包解析我们需要的内容和下一页的url,然后不断循环就能实现爬取答案的目的。
  ③在提取内容时,一个是content,一个是excerpt,excerpt是摘录的意思,内容并不完整,但目前提取content老是报错,我也不知道为啥hhh
  ④退出循环的条件可能并不满足,不过代码还在跑,跑到最后它自己就报错退出了,我觉得不影响使用就没管它hhh
  昨天发了一篇关于微博的推文,不过没看到推送,今天再发一遍。
  import os<br />import json<br />import requests<br />import pandas as pd<br />from bs4 import BeautifulSoup<br />def fetch(max_id):<br /> url = 'https://weibo.com/ajax/statuses/buildComments'<br /> headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'}<br /> params = {'flow': 0,<br /> 'is_reload': 1,<br /> 'id': 4811924297221505,<br /> 'is_show_bulletin': 2,<br /> 'is_mix': 0,<br /> 'max_id': max_id,<br /> 'count': 20,<br /> 'uid': 2803301701}<br /> res = requests.get(url, headers=headers, params=params)<br /> return res.json()<br /># y = fetch()<br /># print(y)<br />def parse(y): #y = fetch()=res.json()<br /> data = y['data'] #y['data']=res.json()['data']<br /> max_id = y['max_id']<br /> comment_all = []<br /> for item in data:<br /> name = item['user']['screen_name']<br /> content = BeautifulSoup(item['text'], 'html.parser').text<br /> date = item['created_at']<br /> likes = item['like_counts']<br /> ip = item['user']['location']<br /> comment_data = [name, content, date, likes, ip]<br /> comment_all.append(comment_data)<br /> return comment_all, max_id<br />def save(data, path, filename):<br /><br /> if not os.path.exists(path):<br /> os.makedirs(path)<br /> df = pd.DataFrame(data)#data参数<br /> df.to_csv(path+filename, encoding='utf_8_sig', mode='a', index=False, sep=',', header=False)<br /><br />if __name__ == '__main__':#注意是两个==<br /> max_id = 0<br /> path = 'F:/微博/'<br /> filename = 'weibo.csv'<br /> csvHeader = [['用户昵称', '评论内容', '评论时间', '被点赞数', '所在城市']]<br /> save(csvHeader, path, filename)#csvheader在这里代替了data被写入了pd.DateFrame()<br /> while(True):<br /> y = fetch(max_id)<br /> comment_all, max_id = parse(y)<br /> save(comment_all, path, filename)<br /> if max_id == 0:<br /> break<br />
  大体思路:
  
  分析网址构造——获取网页数据——解析数据——存储数据。
  ①分析网址构造:
  静态的还是动态的?
  规律:先翻页,后抓包。xhr还是doc?
  微博评论是Ajax动态渲染出来的。
  如何应对Ajax?
  发现请求头的规律,构造函数,伪装成浏览器给服务器发送请求以获得数据。
  ②获得网页数据
  Requests URL 自“?”之后皆为参数,将其写入params中。
  Request Method为get,
  
  使用requests()函数以获取数据,并将返回的函数res.json()
  ③解析数据
  寻找需要的数据,然后遍历,并保存到列表中。
  ④保存数据
  使用dateframe生成一个csv文件,并先行设置好csv的header,当max_id = 0 时退出循环。
  详细内容参见【机灵鹤】公众号,这个博主超赞的!!!
  最后看看结果:
  知乎的↓
  微博的↓

会议预告|2019年IIPC网页存档会议将在克罗地亚萨格勒布召开

网站优化优采云 发表了文章 • 0 个评论 • 37 次浏览 • 2022-09-12 14:30 • 来自相关话题

  会议预告|2019年IIPC网页存档会议将在克罗地亚萨格勒布召开
  Part1 会议简介
  IIPC 网页存档会议将于2019年6月6日和7日在克罗地亚萨格勒布举行。IIPC网页存档会议是一个国际论坛,为网页存档从业者,研究人员,开发人员以及从网页存档开始的人们提供分享经验,传播知识的机会。这也恰逢克罗地亚网络档案馆(HAW)成立15周年。
  第一位主讲人是欧洲平台运营商Europeana Foundation的执行董事Harry Verwayen。他通过广泛提供数字馆藏,支持博物馆、画廊和档案馆进行数字化转型,以便人们可以找到并高效使用它们。
  Part2 About the IIPC
  01成立背景(HISTORY)
  2003年7月,IIPC在法国国家图书馆正式成立,共有12家机构参加。成员们一致同意资助和参加为实现IIPC的目标而设立的项目和工作组。最初的协议有效期为三年,成员仅限于特许机构。IIPC现在向世界各地的图书馆、档案馆、博物馆和文化遗产机构开放,欢迎查询成为会员。
  02身份介绍(WHO WE ARE)
  IIPC成员是来自45个国家的组织,包括国家、大学和区域图书馆和档案馆。成员参加了专注于网络档案内容开发和保存的工作组。领导IIPC由选举产生的指导委员会、成员干事和工作组领导人领导。
  03任务及目标(MISSION & GOALS)
  IIPC的使命是为世界各地的人从互联网获取、保存和提供可获取的知识和信息,促进全球交流和国际关系。
  为实现这一使命,IIPC正在努力实现以下目标:
  
  Part3 About the Web Archiving
  01何为网页存档?
  网页存档是收集万维网的部分内容,以档案格式进行保存,并提供访问和使用服务的过程。
  02为什么要进行网页存档?
  互联网开创了前所未有的知识共享、创造创新和互联的时代,并为负责记录和保存当代知识和文化的机构带来了新挑战。记忆保存机构收集的许多信息内容现在只能在网上获得和使用,如学术出版物,宣传材料,艺术品,政府文件和新闻。随着网页内容不断更新和展现形式的动态化,为留存这些内容,延续传承,必须对网页进行实时捕获和保存。网页资源的可用性和持久性是数字社会中不可忽视的问题。实际中,“链接损坏”现象丛生。由于网页以不保留旧URL的方式关闭或重新设计,使得网络上共享的大量URL在一段时间后不链接,导致网页内容不能继续访问。
  另外,网页内容可能会基于法律因素被官方取消;或由共享它的用户从社交媒体上删除;或者因为“被遗忘的权利”等种种原因被删除。这些现象所反映出的网页内容短暂性的问题,引发了人们关于其对信息的可用性、问责制甚至审查制度的影响的争论。种种情况,使得Web存档服务在当今的信息生态系统中发挥着越来越重要的作用。如Wayback Machine ()它主动地对网页的大部分内容进行存档,允许用户检索和回溯超过3,000亿页的历史网页。存档服务除了解决链接损坏问题外,还有许多其他用途。
  如果你也对网页存档感兴趣的话,可以跟小编一起接着看看这些:
  (1)网页存档过程的工作原理
  An overview of how the process of web archiving works
  目的:弥补现有馆藏的不足并服务不同的目标。
  内容:为文化遗产或作为版权保管制度的一部分的内容。不同组织收集的内容不同,大学一般专注于收集为研究者或教育需求服务的网络档案;公司组织收集的网络档案一般用于法律或记录保存,主要存档网页上的特定文件或站点。
  保存:对网络归档的目的是在不进行修改的情况下保留所收集内容的原始形式。为了实现这一目标,需要适当的工具、标准、策略和最佳实践,以确保随着时间的推移对网络归档的管理。
  访问:网页存档的数据需要使用特殊的软件工具。研究人员可以一页一页地查看存档的web站点,也可以将整个集合作为数据进行处理,从而揭示出集合的广泛特征。隶属于IIPC的组织致力于确保它们的网络档案收藏得到保护,并使未来的研究人员、历史学家和公众能够访问它们。
  (2)IIPC成员开发和使用的工具和软件,用于存档和提供对历史网络资料的访问
  Tools & Software
  存档主要用到的工具有;运用ArchiveBox(原书签存储服务器)来维护来自RSS的提要、书签和链接,利用archivenow(一个Python库)将web资源按需推送到web存档中。并且安装运用Brozzler、crocoite、Heritrix、squidwarf c、Web2Warc等爬虫程序,获取页面并提取链接,获取网页内容,利用SiteStory选择性地捕获和存储在web客户机(浏览器)和web服务器之间发生的事务,并通过WARC输出所抓取的内容,利用html2war将每个简单的脚本转换离线数据,之后使用编年史这一工具进行检索与访问。普通用户通过Social Feed Manager来自Twitter、Tumblr、Flickr和新浪微博公共api的社交媒体。
  
  (3)用于存档Web的众多用例的案例研究
  Case studies
  网站的大规模语料库的捕获为分析文本模式和趋势的提供了无限可能——利用词频分析、文本情感分析、可视化分析等技术提取和分析Web档案馆重的已爬网站,揭示诸如术语之间的共现频率关系,还可以对大量文本执行情感分析,以确定在讨论特定主题时使用的情绪。N-gram检索是一个用语可视化工具,用于绘制用户定义的搜索词或短语随着时间的推移而出现的情况。
  详情可见
  (UK Web Archive: N-gram Search项目)
  随着大型网站被捕获,它们之间的链接也被捕获。通过挖掘这些链接的站点和数据网络,可以观察个人、机构等之间的关系。Common Crawl是一个非营利组织,它对网站进行捕获并向公众免费提供其档案和数据集,以探索不同语言的网站之间的链接并实现其可视化。
  详情可见
  (Babel 2012 Web语言链接项目)
  Part4 总结
  网页存档是收集已记录在万维网上的数据,存储数据,确保数据保存在存档中,并使收集的数据可用于未来研究的过程。互联网档案馆和几个国家图书馆于1996年启动了网页存档实践。国际互联网保护联盟(IIPC)于2003年成立,也极大地促进了国际合作,开发了用于创建网络档案的标准和开源工具。这些发展,以及在网络上创建和记录的人类文化的不断增长的部分,使得网页存档成为越来越不可避免的趋势。图书馆和档案馆以及相关机构必须面对网页存档的挑战并且为应对这些挑战做好准备。
  统稿:孙馨阳
  撰写:孙馨阳、刘贞伶、秦杨、许雅炘、何玉颜
  排版:何玉颜
  审核:李子林、刘俊恒 查看全部

  会议预告|2019年IIPC网页存档会议将在克罗地亚萨格勒布召开
  Part1 会议简介
  IIPC 网页存档会议将于2019年6月6日和7日在克罗地亚萨格勒布举行。IIPC网页存档会议是一个国际论坛,为网页存档从业者,研究人员,开发人员以及从网页存档开始的人们提供分享经验,传播知识的机会。这也恰逢克罗地亚网络档案馆(HAW)成立15周年。
  第一位主讲人是欧洲平台运营商Europeana Foundation的执行董事Harry Verwayen。他通过广泛提供数字馆藏,支持博物馆、画廊和档案馆进行数字化转型,以便人们可以找到并高效使用它们。
  Part2 About the IIPC
  01成立背景(HISTORY)
  2003年7月,IIPC在法国国家图书馆正式成立,共有12家机构参加。成员们一致同意资助和参加为实现IIPC的目标而设立的项目和工作组。最初的协议有效期为三年,成员仅限于特许机构。IIPC现在向世界各地的图书馆、档案馆、博物馆和文化遗产机构开放,欢迎查询成为会员。
  02身份介绍(WHO WE ARE)
  IIPC成员是来自45个国家的组织,包括国家、大学和区域图书馆和档案馆。成员参加了专注于网络档案内容开发和保存的工作组。领导IIPC由选举产生的指导委员会、成员干事和工作组领导人领导。
  03任务及目标(MISSION & GOALS)
  IIPC的使命是为世界各地的人从互联网获取、保存和提供可获取的知识和信息,促进全球交流和国际关系。
  为实现这一使命,IIPC正在努力实现以下目标:
  
  Part3 About the Web Archiving
  01何为网页存档?
  网页存档是收集万维网的部分内容,以档案格式进行保存,并提供访问和使用服务的过程。
  02为什么要进行网页存档?
  互联网开创了前所未有的知识共享、创造创新和互联的时代,并为负责记录和保存当代知识和文化的机构带来了新挑战。记忆保存机构收集的许多信息内容现在只能在网上获得和使用,如学术出版物,宣传材料,艺术品,政府文件和新闻。随着网页内容不断更新和展现形式的动态化,为留存这些内容,延续传承,必须对网页进行实时捕获和保存。网页资源的可用性和持久性是数字社会中不可忽视的问题。实际中,“链接损坏”现象丛生。由于网页以不保留旧URL的方式关闭或重新设计,使得网络上共享的大量URL在一段时间后不链接,导致网页内容不能继续访问。
  另外,网页内容可能会基于法律因素被官方取消;或由共享它的用户从社交媒体上删除;或者因为“被遗忘的权利”等种种原因被删除。这些现象所反映出的网页内容短暂性的问题,引发了人们关于其对信息的可用性、问责制甚至审查制度的影响的争论。种种情况,使得Web存档服务在当今的信息生态系统中发挥着越来越重要的作用。如Wayback Machine ()它主动地对网页的大部分内容进行存档,允许用户检索和回溯超过3,000亿页的历史网页。存档服务除了解决链接损坏问题外,还有许多其他用途。
  如果你也对网页存档感兴趣的话,可以跟小编一起接着看看这些:
  (1)网页存档过程的工作原理
  An overview of how the process of web archiving works
  目的:弥补现有馆藏的不足并服务不同的目标。
  内容:为文化遗产或作为版权保管制度的一部分的内容。不同组织收集的内容不同,大学一般专注于收集为研究者或教育需求服务的网络档案;公司组织收集的网络档案一般用于法律或记录保存,主要存档网页上的特定文件或站点。
  保存:对网络归档的目的是在不进行修改的情况下保留所收集内容的原始形式。为了实现这一目标,需要适当的工具、标准、策略和最佳实践,以确保随着时间的推移对网络归档的管理。
  访问:网页存档的数据需要使用特殊的软件工具。研究人员可以一页一页地查看存档的web站点,也可以将整个集合作为数据进行处理,从而揭示出集合的广泛特征。隶属于IIPC的组织致力于确保它们的网络档案收藏得到保护,并使未来的研究人员、历史学家和公众能够访问它们。
  (2)IIPC成员开发和使用的工具和软件,用于存档和提供对历史网络资料的访问
  Tools & Software
  存档主要用到的工具有;运用ArchiveBox(原书签存储服务器)来维护来自RSS的提要、书签和链接,利用archivenow(一个Python库)将web资源按需推送到web存档中。并且安装运用Brozzler、crocoite、Heritrix、squidwarf c、Web2Warc等爬虫程序,获取页面并提取链接,获取网页内容,利用SiteStory选择性地捕获和存储在web客户机(浏览器)和web服务器之间发生的事务,并通过WARC输出所抓取的内容,利用html2war将每个简单的脚本转换离线数据,之后使用编年史这一工具进行检索与访问。普通用户通过Social Feed Manager来自Twitter、Tumblr、Flickr和新浪微博公共api的社交媒体。
  
  (3)用于存档Web的众多用例的案例研究
  Case studies
  网站的大规模语料库的捕获为分析文本模式和趋势的提供了无限可能——利用词频分析、文本情感分析、可视化分析等技术提取和分析Web档案馆重的已爬网站,揭示诸如术语之间的共现频率关系,还可以对大量文本执行情感分析,以确定在讨论特定主题时使用的情绪。N-gram检索是一个用语可视化工具,用于绘制用户定义的搜索词或短语随着时间的推移而出现的情况。
  详情可见
  (UK Web Archive: N-gram Search项目)
  随着大型网站被捕获,它们之间的链接也被捕获。通过挖掘这些链接的站点和数据网络,可以观察个人、机构等之间的关系。Common Crawl是一个非营利组织,它对网站进行捕获并向公众免费提供其档案和数据集,以探索不同语言的网站之间的链接并实现其可视化。
  详情可见
  (Babel 2012 Web语言链接项目)
  Part4 总结
  网页存档是收集已记录在万维网上的数据,存储数据,确保数据保存在存档中,并使收集的数据可用于未来研究的过程。互联网档案馆和几个国家图书馆于1996年启动了网页存档实践。国际互联网保护联盟(IIPC)于2003年成立,也极大地促进了国际合作,开发了用于创建网络档案的标准和开源工具。这些发展,以及在网络上创建和记录的人类文化的不断增长的部分,使得网页存档成为越来越不可避免的趋势。图书馆和档案馆以及相关机构必须面对网页存档的挑战并且为应对这些挑战做好准备。
  统稿:孙馨阳
  撰写:孙馨阳、刘贞伶、秦杨、许雅炘、何玉颜
  排版:何玉颜
  审核:李子林、刘俊恒

c抓取网页数据c++模拟子线程设计

网站优化优采云 发表了文章 • 0 个评论 • 44 次浏览 • 2022-09-03 01:00 • 来自相关话题

  c抓取网页数据c++模拟子线程设计
  
<p>c抓取网页数据c++设计多线程在多线程编程中,一般来说会使用两个线程,一个是主线程,一个是子线程,大多数情况下,你是看不到两个线程的。所以一个主线程的进程,可以完成多个子线程的功能。通常而言,当一个主线程不能处理全部的工作时,子线程可以使用辅助的线程。下面以c++抓取网页数据c++模拟子线程:#includeintmain(){char*p,i,sz=*hash_std_csv;std::unique_ptrinc;unique_ptrcoi;unique_ptr*hash;hash+=*inc;if(i==&hash){coi=*hash;*hash=inc;}else{sz=*hash;*hash=inc;}continue;}#includeintmain(){inti,o;for(i=0;i 查看全部

  c抓取网页数据c++模拟子线程设计
  
<p>c抓取网页数据c++设计多线程在多线程编程中,一般来说会使用两个线程,一个是主线程,一个是子线程,大多数情况下,你是看不到两个线程的。所以一个主线程的进程,可以完成多个子线程的功能。通常而言,当一个主线程不能处理全部的工作时,子线程可以使用辅助的线程。下面以c++抓取网页数据c++模拟子线程:#includeintmain(){char*p,i,sz=*hash_std_csv;std::unique_ptrinc;unique_ptrcoi;unique_ptr*hash;hash+=*inc;if(i==&hash){coi=*hash;*hash=inc;}else{sz=*hash;*hash=inc;}continue;}#includeintmain(){inti,o;for(i=0;i

学校院级老师专业生的工作经验分享-c抓取网页数据

网站优化优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2022-07-31 19:07 • 来自相关话题

  学校院级老师专业生的工作经验分享-c抓取网页数据
  c抓取网页数据,读写文件,最好是能有特定的格式文件,wxml就很好。支持tcp/ip、http、https。操作的范围广,
  
  php的话js是最基本的吧
  1php就是最好的语言2只用php可以做:网站系统、广告系统3c#系的语言可以用来做web网站和服务器的桌面程序开发,但c#比较复杂,
  
  说一下我想到的,那一般是写个小手机程序,他有自己的逻辑,你可以执行这个逻辑,然后他去服务器接受请求,然后计算,显示数据。至于tcp的话,就是字面上的意思。
  在工厂,数控编程的工作都由机器人来完成,那么,写代码的工作,更是数控编程工作的一个分支吧,所以,这个问题,因为不一定是所有工厂都有完善的自动化工作流程,所以,这个问题在实际生活中,找准分工,
  其实不一定的,当然这是服务器的问题,一个网站的代码由很多代码组成,php和java都是后端的,用于web方面,说说我自己接触的java和php,java的优势在于程序员之间可以很方便地互传文件和控制后端的进程。php在前端可以无缝通过http来实现后端程序的数据处理,虽然可以控制,但是速度还是很慢的,能上unix接触一下shell吧,做服务器,除了要学习一些命令编程和工具的使用外,还要学习这些语言相关的大型网站的架构设计,如果你要独立开发,那你就要设计好要做什么功能,然后设计php和java语言那些开发环境吧,说着说着感觉要变成我们学校院级老师专业生的工作了。 查看全部

  学校院级老师专业生的工作经验分享-c抓取网页数据
  c抓取网页数据,读写文件,最好是能有特定的格式文件,wxml就很好。支持tcp/ip、http、https。操作的范围广,
  
  php的话js是最基本的吧
  1php就是最好的语言2只用php可以做:网站系统、广告系统3c#系的语言可以用来做web网站和服务器的桌面程序开发,但c#比较复杂,
  
  说一下我想到的,那一般是写个小手机程序,他有自己的逻辑,你可以执行这个逻辑,然后他去服务器接受请求,然后计算,显示数据。至于tcp的话,就是字面上的意思。
  在工厂,数控编程的工作都由机器人来完成,那么,写代码的工作,更是数控编程工作的一个分支吧,所以,这个问题,因为不一定是所有工厂都有完善的自动化工作流程,所以,这个问题在实际生活中,找准分工,
  其实不一定的,当然这是服务器的问题,一个网站的代码由很多代码组成,php和java都是后端的,用于web方面,说说我自己接触的java和php,java的优势在于程序员之间可以很方便地互传文件和控制后端的进程。php在前端可以无缝通过http来实现后端程序的数据处理,虽然可以控制,但是速度还是很慢的,能上unix接触一下shell吧,做服务器,除了要学习一些命令编程和工具的使用外,还要学习这些语言相关的大型网站的架构设计,如果你要独立开发,那你就要设计好要做什么功能,然后设计php和java语言那些开发环境吧,说着说着感觉要变成我们学校院级老师专业生的工作了。

化合物信息批量抓取

网站优化优采云 发表了文章 • 0 个评论 • 295 次浏览 • 2022-07-29 05:42 • 来自相关话题

  化合物信息批量抓取
  前段时间老板布置了一项任务,需要收集整理些化合物,于是现学了一些简单爬虫,同时发现了一个针对pubchem中物质信息提取的工具,趁着现在分享给大家!
  爬虫篇我拿到了一些化合物,我想从一个网站中下载该物质的注释信息,但是发现是不能直接下载的,例如图片中红色框中的文字部分,一个一个copy比较浪费时间,于是爬虫ing~
  网站爬虫需要了解下网站的布局,F12键会打开新世界!如下图所示,我们能发现注释信息所在的位置,因此通过爬虫定位到此,批量获取信息!网页爬取太频繁会导致请求失败,可以尝试更换IP或者模拟浏览器进行访问!
  爬虫源码
  """demo28 - 抓取化合物信息<br />Author:CXangDate:2022/7/15"""import timeimport requestsimport lxmlfrom lxml import etreeimport reimport pandas as pdimport bs4<br /># 药物列表# 需要先将待下载化合物名称保存为txt文件"""输入示例:VancomycinDemethylvancomycinTeicoplaninBleomycin"""with open(r"/path/to/your/drugname.txt") as f: content = f.read()lines = [line.split(" ") for line in content.split("\n")]druglist = []for line in lines: druglist += line<br /># 导入网站URLurls = ["https://drugcentral.org/?q={}".format(drug) for drug in druglist]<br /># 建立储存信息字典result = {"name": [], # 药物名称 "define": [] # 药物描述 }<br /><br /># 记录时间-startst = time.time()<br /># 循环遍历# 定义访问休息时间,每个conts大于5则休息几秒的时间count = 0for url in urls: count += 1 print(url) r = requests.get(url,verify=False) html = bs4.BeautifulSoup(r.text, 'html.parser') # 寻找目标内容 all_drugs = html.find("div", class_="content container").find_all("tr") # print(all_drugs) for data in all_drugs: drug_name = data.find("strong", class_="sealine").text drug_define = str(data.find_all(id="sea")) # 字典分割 drug_define = drug_define.split(r'sea">')[1] drug_define = drug_define.split(r'')[0] # 若药物不含有定义描述则返回NA if not drug_define: drug_define = "NA" # print(drug_define) result["name"].append(drug_name) result["define"].append(drug_define) if count > 5: time.sleep(3) count = 0 df = pd.DataFrame(result) df.to_csv(r"/path/to/your/output.csv", index=False)<br /># 记录时间-endet = time.time()# 计算使用时间print(f"All tasks finished, and costs {round(et-st, 2)} seconds.")
  
  抓取结果显示
  PubChemPy
  PubChem就是那个熟悉的化合物大全,涵盖范围很广。包含物质的各种信息,例如名称、分子式、分子量等信息,此时我有一堆化合物名称,我要如何批量拿到物质分子式、分子量等信息呢?一个一个搜索比较浪费时间,无意中发现PubChemPy,PubChemPy是通过python来获取pubchem中相关化合物数据的python库(PubChemPy provides a way to interact with PubChem in Python);
  安装Installation
  PubChemPy 支持Python版本包括2.7, 3.5, and 3.6. 没有各种依赖.可以通过多种方式进行安装,包括pip、conda或者下载压缩包自行安装。
  
  使用Getting started
  import pubchempy as pcpc = pcp.Compound.from_cid(5090)print c.molecular_formula# C17H14O4Sprint c.molecular_weight# 314.35566print c.isomeric_smiles# CS(=O)(=O)C1=CC=C(C=C1)C2=C(C(=O)OC2)C3=CC=CC=C3print c.xlogp# 2.3print c.iupac_name# 3-(4-methylsulfonylphenyl)-4-phenyl-2H-furan-5-oneprint c.synonyms# [u'rofecoxib', u'Vioxx', u'Ceoxx', u'162011-90-7', u'MK 966', ... ]
  尝试通过化合物名称批量获取信息
  # 需要先将待下载化合物名称保存为txt文件。"""输入示例:VancomycinDemethylvancomycinTeicoplaninBleomycin"""<br /># 批量抓取import urllibimport pubchempyimport pandas as pdimport numpy as npwith open('/path/to/your/drugname.txt','r',encoding='utf-8-sig') as file1: file_lines = file1.readlines() name_list=[] a=[] cc=[] d=[] e=[] f=[] g=[]#readlines读取字符串格式,需将其转换成列表格式 for i in file_lines: j=i.strip() #去掉每行头尾空白 name_list.append(str(j)) for k in name_list: results = pubchempy.get_compounds(k, 'name') for l in results: try: print('CID: {}\tMass: {}\tName: {}\tMolfor: {}\tSmi: {}\tSyn: {}'.format(l.cid,l.exact_mass,l.iupac_name,l.molecular_formula,l.isomeric_smiles,l.synonyms)) MFs=l.molecular_formula MWs=l.molecular_weight ISs=l.isomeric_smiles Sys=l.synonyms Cis=l.cid a.append(k) cc.append(MFs) d.append(ISs) e.append(Sys) f.append(Cis) g.append(MWs) except (pubchempy.BadRequestError,TimeoutError,urllib.error.URLError,ValueError): pass dataframe=pd.DataFrame({'name':a, 'molecular_formula':cc, 'molecular_weight':g, 'isomeric_smiles':d, 'synonyms':e, 'cid':f}) # outputpath是保存文件路径 outputpath = '/path/to/your/output.csv' dataframe.to_csv (outputpath,index=False,sep=',')
  抓取结果显示
  写在最后
  匆忙之中完成此次更新,如有问题欢迎后台交流呀~ 查看全部

  化合物信息批量抓取
  前段时间老板布置了一项任务,需要收集整理些化合物,于是现学了一些简单爬虫,同时发现了一个针对pubchem中物质信息提取的工具,趁着现在分享给大家!
  爬虫篇我拿到了一些化合物,我想从一个网站中下载该物质的注释信息,但是发现是不能直接下载的,例如图片中红色框中的文字部分,一个一个copy比较浪费时间,于是爬虫ing~
  网站爬虫需要了解下网站的布局,F12键会打开新世界!如下图所示,我们能发现注释信息所在的位置,因此通过爬虫定位到此,批量获取信息!网页爬取太频繁会导致请求失败,可以尝试更换IP或者模拟浏览器进行访问!
  爬虫源码
  """demo28 - 抓取化合物信息<br />Author:CXangDate:2022/7/15"""import timeimport requestsimport lxmlfrom lxml import etreeimport reimport pandas as pdimport bs4<br /># 药物列表# 需要先将待下载化合物名称保存为txt文件"""输入示例:VancomycinDemethylvancomycinTeicoplaninBleomycin"""with open(r"/path/to/your/drugname.txt") as f: content = f.read()lines = [line.split(" ") for line in content.split("\n")]druglist = []for line in lines: druglist += line<br /># 导入网站URLurls = ["https://drugcentral.org/?q={}".format(drug) for drug in druglist]<br /># 建立储存信息字典result = {"name": [], # 药物名称 "define": [] # 药物描述 }<br /><br /># 记录时间-startst = time.time()<br /># 循环遍历# 定义访问休息时间,每个conts大于5则休息几秒的时间count = 0for url in urls: count += 1 print(url) r = requests.get(url,verify=False) html = bs4.BeautifulSoup(r.text, 'html.parser') # 寻找目标内容 all_drugs = html.find("div", class_="content container").find_all("tr") # print(all_drugs) for data in all_drugs: drug_name = data.find("strong", class_="sealine").text drug_define = str(data.find_all(id="sea")) # 字典分割 drug_define = drug_define.split(r'sea">')[1] drug_define = drug_define.split(r'')[0] # 若药物不含有定义描述则返回NA if not drug_define: drug_define = "NA" # print(drug_define) result["name"].append(drug_name) result["define"].append(drug_define) if count > 5: time.sleep(3) count = 0 df = pd.DataFrame(result) df.to_csv(r"/path/to/your/output.csv", index=False)<br /># 记录时间-endet = time.time()# 计算使用时间print(f"All tasks finished, and costs {round(et-st, 2)} seconds.")
  
  抓取结果显示
  PubChemPy
  PubChem就是那个熟悉的化合物大全,涵盖范围很广。包含物质的各种信息,例如名称、分子式、分子量等信息,此时我有一堆化合物名称,我要如何批量拿到物质分子式、分子量等信息呢?一个一个搜索比较浪费时间,无意中发现PubChemPy,PubChemPy是通过python来获取pubchem中相关化合物数据的python库(PubChemPy provides a way to interact with PubChem in Python);
  安装Installation
  PubChemPy 支持Python版本包括2.7, 3.5, and 3.6. 没有各种依赖.可以通过多种方式进行安装,包括pip、conda或者下载压缩包自行安装。
  
  使用Getting started
  import pubchempy as pcpc = pcp.Compound.from_cid(5090)print c.molecular_formula# C17H14O4Sprint c.molecular_weight# 314.35566print c.isomeric_smiles# CS(=O)(=O)C1=CC=C(C=C1)C2=C(C(=O)OC2)C3=CC=CC=C3print c.xlogp# 2.3print c.iupac_name# 3-(4-methylsulfonylphenyl)-4-phenyl-2H-furan-5-oneprint c.synonyms# [u'rofecoxib', u'Vioxx', u'Ceoxx', u'162011-90-7', u'MK 966', ... ]
  尝试通过化合物名称批量获取信息
  # 需要先将待下载化合物名称保存为txt文件。"""输入示例:VancomycinDemethylvancomycinTeicoplaninBleomycin"""<br /># 批量抓取import urllibimport pubchempyimport pandas as pdimport numpy as npwith open('/path/to/your/drugname.txt','r',encoding='utf-8-sig') as file1: file_lines = file1.readlines() name_list=[] a=[] cc=[] d=[] e=[] f=[] g=[]#readlines读取字符串格式,需将其转换成列表格式 for i in file_lines: j=i.strip() #去掉每行头尾空白 name_list.append(str(j)) for k in name_list: results = pubchempy.get_compounds(k, 'name') for l in results: try: print('CID: {}\tMass: {}\tName: {}\tMolfor: {}\tSmi: {}\tSyn: {}'.format(l.cid,l.exact_mass,l.iupac_name,l.molecular_formula,l.isomeric_smiles,l.synonyms)) MFs=l.molecular_formula MWs=l.molecular_weight ISs=l.isomeric_smiles Sys=l.synonyms Cis=l.cid a.append(k) cc.append(MFs) d.append(ISs) e.append(Sys) f.append(Cis) g.append(MWs) except (pubchempy.BadRequestError,TimeoutError,urllib.error.URLError,ValueError): pass dataframe=pd.DataFrame({'name':a, 'molecular_formula':cc, 'molecular_weight':g, 'isomeric_smiles':d, 'synonyms':e, 'cid':f}) # outputpath是保存文件路径 outputpath = '/path/to/your/output.csv' dataframe.to_csv (outputpath,index=False,sep=',')
  抓取结果显示
  写在最后
  匆忙之中完成此次更新,如有问题欢迎后台交流呀~

c抓取网页数据有什么好大惊小怪的吗

网站优化优采云 发表了文章 • 0 个评论 • 58 次浏览 • 2022-07-20 16:03 • 来自相关话题

  c抓取网页数据有什么好大惊小怪的吗
  c抓取网页数据有什么好大惊小怪的吗?不觉得。如果是r,reveal,python,我们一般是处理网页源代码,这样可以获取到网页的不同模块及作用。例如,我们根据网页中的标识找到感兴趣的内容(将网页划分为webpage),我们用正则表达式,通过正则表达式找到页面中的值,也可以找到网页所描述的类型等等。当然,我们有更高级的数据分析目的。
  
  但是,网页实在是太大了,要获取完整网页,方法千千万万,就需要人工处理。我们现在要有个工具,可以自动采集网页数据,而且数据量又小,简直是伟大啊~其实c爬虫网页数据的方法也非常简单,在家无聊时拿下首页数据集练练手吧~参考网址:。
  
  我从某狗答案中看到了支付宝的数据抓取,据说动态和反爬虫技术非常厉害,话说他的大神回答的图片中并没有数据爬取,主要还是前期的准备和抓取代码的自己加工。其实关键是定位到爬取的页面元素,然后设计代码,进行抓取。
  python爬数据的就是抓取页面元素获取数据而已啊,但是你有没有想过为什么页面数据抓取出来要加上反爬虫这个神秘的套路。我想给大家介绍一下爬虫的两种用法。beautifulsoup()就是爬虫。这个网站是我最近从一个网站上爬的。以下内容没用看懂的自己百度。链接:-3-1--这个网站是北京某市的一个市场数据库网站,以下是爬取的结果所以你可以根据自己的需要,自己分析和上手干干净净的数据;或者你也可以需要做页面分析,自己来写爬虫或者c、python爬虫开发工具,也就是楼上的观测数据库网站?最后再讲一下最后给大家推荐个网站::,还可以免费试用发一些体会。 查看全部

  c抓取网页数据有什么好大惊小怪的吗
  c抓取网页数据有什么好大惊小怪的吗?不觉得。如果是r,reveal,python,我们一般是处理网页源代码,这样可以获取到网页的不同模块及作用。例如,我们根据网页中的标识找到感兴趣的内容(将网页划分为webpage),我们用正则表达式,通过正则表达式找到页面中的值,也可以找到网页所描述的类型等等。当然,我们有更高级的数据分析目的。
  
  但是,网页实在是太大了,要获取完整网页,方法千千万万,就需要人工处理。我们现在要有个工具,可以自动采集网页数据,而且数据量又小,简直是伟大啊~其实c爬虫网页数据的方法也非常简单,在家无聊时拿下首页数据集练练手吧~参考网址:。
  
  我从某狗答案中看到了支付宝的数据抓取,据说动态和反爬虫技术非常厉害,话说他的大神回答的图片中并没有数据爬取,主要还是前期的准备和抓取代码的自己加工。其实关键是定位到爬取的页面元素,然后设计代码,进行抓取。
  python爬数据的就是抓取页面元素获取数据而已啊,但是你有没有想过为什么页面数据抓取出来要加上反爬虫这个神秘的套路。我想给大家介绍一下爬虫的两种用法。beautifulsoup()就是爬虫。这个网站是我最近从一个网站上爬的。以下内容没用看懂的自己百度。链接:-3-1--这个网站是北京某市的一个市场数据库网站,以下是爬取的结果所以你可以根据自己的需要,自己分析和上手干干净净的数据;或者你也可以需要做页面分析,自己来写爬虫或者c、python爬虫开发工具,也就是楼上的观测数据库网站?最后再讲一下最后给大家推荐个网站::,还可以免费试用发一些体会。

c抓取网页数据可以用urllib2,可以抓取io效率有点低

网站优化优采云 发表了文章 • 0 个评论 • 45 次浏览 • 2022-07-17 15:08 • 来自相关话题

  c抓取网页数据可以用urllib2,可以抓取io效率有点低
  c抓取网页数据可以用urllib2,可以抓取成功,就是io效率有点低。你可以看看urllib包能抓哪些网页,然后从里面挑效率高的来用。urllib2有ajax异步请求,抓取xml也可以用。
  
  报错,可能是你c语言版本不高。libxml2是通用的xml文件解析库。你可以从libxml2的官方网站,下一个对应的apk,安装到手机上,这样libxml2这个库就能在安卓手机上使用了。
  
  相比当年的cqt,微软用qml也用自己的ui库来把c++工程模块化,可以减少一些开发难度。但是微软的qml自己那个库做的确实很差很烂。所以微软的工程师才一直追着undoct学习,你看有多少好的库是undoct搞出来的。本人看过undoctinnetworkenginewiki(undoctinnetworkenginewiki),每次看完就给我这种感觉:whyshit!好吧对了,xx手机系统现在基本都支持qml的。到时候修改一下就能拿到所有的数据。
  你可以先从c++抓取不能在其他系统上被优化的windowsapi方面入手,然后对excel这个windows上可以使用的api有兴趣的话,可以从winform的api入手,但是如果你对c++的http相关的api非常感兴趣也可以研究下eventhttp之类的,如果非常不感兴趣的话,也可以往编程语言标准库上转转,但是如果你c++水平已经差不多可以自己动手做东西的话,java这个作为工作语言也是非常合适的,为啥没必要重头学一门后端语言呢。 查看全部

  c抓取网页数据可以用urllib2,可以抓取io效率有点低
  c抓取网页数据可以用urllib2,可以抓取成功,就是io效率有点低。你可以看看urllib包能抓哪些网页,然后从里面挑效率高的来用。urllib2有ajax异步请求,抓取xml也可以用。
  
  报错,可能是你c语言版本不高。libxml2是通用的xml文件解析库。你可以从libxml2的官方网站,下一个对应的apk,安装到手机上,这样libxml2这个库就能在安卓手机上使用了。
  
  相比当年的cqt,微软用qml也用自己的ui库来把c++工程模块化,可以减少一些开发难度。但是微软的qml自己那个库做的确实很差很烂。所以微软的工程师才一直追着undoct学习,你看有多少好的库是undoct搞出来的。本人看过undoctinnetworkenginewiki(undoctinnetworkenginewiki),每次看完就给我这种感觉:whyshit!好吧对了,xx手机系统现在基本都支持qml的。到时候修改一下就能拿到所有的数据。
  你可以先从c++抓取不能在其他系统上被优化的windowsapi方面入手,然后对excel这个windows上可以使用的api有兴趣的话,可以从winform的api入手,但是如果你对c++的http相关的api非常感兴趣也可以研究下eventhttp之类的,如果非常不感兴趣的话,也可以往编程语言标准库上转转,但是如果你c++水平已经差不多可以自己动手做东西的话,java这个作为工作语言也是非常合适的,为啥没必要重头学一门后端语言呢。

中post存储信息的方式存放(c抓取)(组图)

网站优化优采云 发表了文章 • 0 个评论 • 41 次浏览 • 2022-07-06 17:07 • 来自相关话题

  中post存储信息的方式存放(c抓取)(组图)
  c抓取网页数据处理后存放在cookie中post存储信息的方式存放在对象中一个driver对象存放cookie和post信息cookie存放在不同的域下有不同的生命周期(默认的容许重定向:七天)post存储信息的方式存放在对象中一个driver对象存放data中每个driver生命周期中创建并销毁只需要新建一个driver对象cocoapods和cocoaplugins是一对多关系cocoapods相当于cocoapodsplugins相当于cocoaplus定制的代码一定要标注好包名和package这些都是很好找的另一个flutterconstantslibrary这个库可以定制很多constants的生命周期referenced这个constants生命周期的默认值是old,refresh,update,returnarguments请遵循guido/gcc·github尽量使用全局的refresh,比如'outref'on'final'gcope如果需要指定refresh的整数个数请注意一个实例只需要在必要的时候执行一次赋值即可。
  
  但是如果这个实例真的在整个生命周期中都没有被执行赋值而flutter的内存受限情况,这个时候默认是相当于执行完整个生命周期。flutter一般使用namespace,而namespace除了字符串非固定以外没有什么好的方式可以简化的获取某一个实例的refresh的值如果需要add某个refresh,请直接add这个标签namespacecocoapods一个channel分成两组flutterchannel和nativechannel。
  
  如果未来你想要相互调用,请考虑构造一个nativechannel,也就是两个channel是对等的,而flutterchannel只是作为nativechannel的一个implementation/default而已。注意在flutter和native中的accessvalue可能不一样。分组是因为native和flutter是解耦的,flutter也要遵循google官方的cookiesocketapi。
  想要使用flutterchannel必须先尝试取消封装了channel和objective-c命名空间。想要构造jsonchannel,请改为nativechannel有关于refresh的一些事情;以及:1.使用cocoapodsbuildtheflutterapp2.使用valgrindvalgrind3.不推荐以下形式生成flutter代码,因为yarn会linkchannels,所以会重复工作。 查看全部

  中post存储信息的方式存放(c抓取)(组图)
  c抓取网页数据处理后存放在cookie中post存储信息的方式存放在对象中一个driver对象存放cookie和post信息cookie存放在不同的域下有不同的生命周期(默认的容许重定向:七天)post存储信息的方式存放在对象中一个driver对象存放data中每个driver生命周期中创建并销毁只需要新建一个driver对象cocoapods和cocoaplugins是一对多关系cocoapods相当于cocoapodsplugins相当于cocoaplus定制的代码一定要标注好包名和package这些都是很好找的另一个flutterconstantslibrary这个库可以定制很多constants的生命周期referenced这个constants生命周期的默认值是old,refresh,update,returnarguments请遵循guido/gcc·github尽量使用全局的refresh,比如'outref'on'final'gcope如果需要指定refresh的整数个数请注意一个实例只需要在必要的时候执行一次赋值即可。
  
  但是如果这个实例真的在整个生命周期中都没有被执行赋值而flutter的内存受限情况,这个时候默认是相当于执行完整个生命周期。flutter一般使用namespace,而namespace除了字符串非固定以外没有什么好的方式可以简化的获取某一个实例的refresh的值如果需要add某个refresh,请直接add这个标签namespacecocoapods一个channel分成两组flutterchannel和nativechannel。
  
  如果未来你想要相互调用,请考虑构造一个nativechannel,也就是两个channel是对等的,而flutterchannel只是作为nativechannel的一个implementation/default而已。注意在flutter和native中的accessvalue可能不一样。分组是因为native和flutter是解耦的,flutter也要遵循google官方的cookiesocketapi。
  想要使用flutterchannel必须先尝试取消封装了channel和objective-c命名空间。想要构造jsonchannel,请改为nativechannel有关于refresh的一些事情;以及:1.使用cocoapodsbuildtheflutterapp2.使用valgrindvalgrind3.不推荐以下形式生成flutter代码,因为yarn会linkchannels,所以会重复工作。

excel2016猴子500强面试题2014基金数据源_文献数据去重-环境实验室

网站优化优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2022-06-30 23:03 • 来自相关话题

  excel2016猴子500强面试题2014基金数据源_文献数据去重-环境实验室
  c抓取网页数据的工具scrapy-scrapy的通用模块aspectj转sqlite的工具使用记录神器workflowy网页上的动态日志产生方法webpack的使用大数据开发的工具及平台pandas库常用的常见绘图工具bokeh,matplotlib,seabornmatplotlib绘图集中的三种绘图方式roc曲线(回归分析中的曲线)islayer(目前比较少用,功能简单,图形花哨)csvexportertopandas文件包含方法iplot(画柱状图)spine(画折线图)adjline(曲线折线函数:sqrt,abs,phqr,np。exp(n1+n。
  
  2))keto(数据图形index,bars,scatter=none)scatterplot(画趋势线)midpoint(histogram图形函数:(x1,y1,x2,y
  
  2),left=right=bottom=bottom)plot(y1,y2,bar,k=
  8)plotline(线)cvx(图形数组w*h,值类型与x共同,包含5个坐标轴。默认不增加图形大小,x轴纵坐标用于表示颜色,y轴纵坐标用于表示数值。x=root+list(x1*h),y=root+list(y1*h)),x1,y1=x*w,y*h对比web自动刷新python2016年的文章链接,指定时间,地点-hd4fxxtosqc成都优采云站抓取同程网房价图2014_adjline(爬虫模拟登录图像采集器)常用图表制作php小方框图2016用户注册信息采集2015北京房价采集2015选区分割条件图(gbk)2016猴子500强面试题2014基金数据分析12014初筛数据源_文献数据去重-环境实验室_新浪博客数据处理-绿色数据清洗-七牛云万语相传2014检索结果取消重复检索关键字过滤2016其他工具使用2高维数据表下载成excel2015下图可以看出需要可视化出柱状图,我想问下excel2016还有没有办法直接画出来?-广播的回答我怎么搞?-vincentvongraafsu-2015破2000,专注大数据更多讨论交流。关注微信公众号“七牛云大数据”,与您共同探索大数据带来的价值!。 查看全部

  excel2016猴子500强面试题2014基金数据源_文献数据去重-环境实验室
  c抓取网页数据的工具scrapy-scrapy的通用模块aspectj转sqlite的工具使用记录神器workflowy网页上的动态日志产生方法webpack的使用大数据开发的工具及平台pandas库常用的常见绘图工具bokeh,matplotlib,seabornmatplotlib绘图集中的三种绘图方式roc曲线(回归分析中的曲线)islayer(目前比较少用,功能简单,图形花哨)csvexportertopandas文件包含方法iplot(画柱状图)spine(画折线图)adjline(曲线折线函数:sqrt,abs,phqr,np。exp(n1+n。
  
  2))keto(数据图形index,bars,scatter=none)scatterplot(画趋势线)midpoint(histogram图形函数:(x1,y1,x2,y
  
  2),left=right=bottom=bottom)plot(y1,y2,bar,k=
  8)plotline(线)cvx(图形数组w*h,值类型与x共同,包含5个坐标轴。默认不增加图形大小,x轴纵坐标用于表示颜色,y轴纵坐标用于表示数值。x=root+list(x1*h),y=root+list(y1*h)),x1,y1=x*w,y*h对比web自动刷新python2016年的文章链接,指定时间,地点-hd4fxxtosqc成都优采云站抓取同程网房价图2014_adjline(爬虫模拟登录图像采集器)常用图表制作php小方框图2016用户注册信息采集2015北京房价采集2015选区分割条件图(gbk)2016猴子500强面试题2014基金数据分析12014初筛数据源_文献数据去重-环境实验室_新浪博客数据处理-绿色数据清洗-七牛云万语相传2014检索结果取消重复检索关键字过滤2016其他工具使用2高维数据表下载成excel2015下图可以看出需要可视化出柱状图,我想问下excel2016还有没有办法直接画出来?-广播的回答我怎么搞?-vincentvongraafsu-2015破2000,专注大数据更多讨论交流。关注微信公众号“七牛云大数据”,与您共同探索大数据带来的价值!。

爬虫万金油,一鹅在手,抓遍全球

网站优化优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-06-26 07:22 • 来自相关话题

  爬虫万金油,一鹅在手,抓遍全球
  爬虫抓取数据有两个头疼的点,写过爬虫的小伙伴们一定都深有体会:
  网站的防抓取机制。你要尽可能将自己伪装成“一个人”,骗过对方的服务器反爬验证。
  网站的内容提取。每个网站都需要你做不同的处理,而且网站一旦改版,你的代码也得跟着更新。
  第一点没什么捷径可走,套路见得多了,也就有经验了。关于第二点,今天咱们就来介绍一个小工具,在某些需求场景下,或许可以给你省不少事。
  Goose
  Goose 是一个文章内容提取器,可以从任意资讯文章类的网页中提取文章主体,并提取标题、标签、摘要、图片、视频等信息,且支持中文网页。它最初是由 用 Java 编写的。python-goose 是用 Python 重写的版本。
  有了这个库,你从网上爬下来的网页可以直接获取正文内容,无需再用 bs4 或正则表达式一个个去处理文本。
  项目地址:
  (py2)
  (py3)
  安装
  网上大多数教程提到的 python-goose 项目目前只支持到 python 2.7。可以通过 pip 安装:
  pip install goose-extractor
  或者安装官网上的方法从源代码安装:
  mkvirtualenv --no-site-packages goose
git clone https://github.com/grangier/python-goose.git
cd python-goose
pip install -r requirements.txt
python setup.py install
  我找到一个 python 3 的版本 goose3:
  pip install goose3
  经过我一些简单的测试,未发现两个版本在结果上有太大的差异。
  快速上手
  这里使用 goose3,而 python-goose 只要把其中的 goose3 改成 goose 即可,接口都是一样的。以我之前发过的一篇文章 为抓取目标来做个演示。
  from goose3 import Goose
from goose3.text import StopWordsChinese
# 初始化,设置中文分词
g = Goose({'stopwords_class': StopWordsChinese})
# 文章地址
url = 'https://mp.weixin.qq.com/s/zflbcF5PS06QC5YJXpiviQ'
# 获取文章内容
article = g.extract(url=url)
# 标题
print('标题:', article.title)
# 显示正文
print(article.cleaned_text)
  输出:
  除了标题 title 和正文 cleaned_text 外,还可以获取一些额外的信息,比如:
  如有有些网站限制了程序抓取,也可以根据需要添加 user-agent 信息:
  
  g = Goose({'browser_user_agent': 'Version/5.1.2 Safari/534.52.7'})
  如果是 goose3,因为使用了 requests 库作为请求模块,因此还可以以相似方式配置 headers、proxies 等属性。
  在上述示例中使用到的 StopWordsChinese 为中文分词器,可一定程度上提高中文文章的识别准确率,但更耗时。
  其他说明
  1.
  Goose 虽然方便,但并不能保证每个网站都能精确获取,因此适合大规模文章的采集,如热点追踪、舆情分析等。它只能从概率上保证大多数网站可以相对准确地抓取。我经过一些尝试后发现,抓取英文网站优于中文网站,主流网站优于小众网站,文本的提取优于图片的提取。
  2.
  从项目中的 requirements.txt 文件可以看出,goose 中使用到了 Pillow、lxml、cssselect、jieba、beautifulsoup、nltk,goose3 还用到了 requests,我们之前很多文章和项目中都有所涉及:
  3.
  如果你是使用基于 python2 的 goose,有可能会遇到编码上的问题(尤其是 windows 上)。这方面可以在公众号对话里回复关键词 编码,我们有过相关的讲解。
  4.
  除了 goose 外,还有其他的正文提取库可以尝试,比如 python-boilerpipe、python-readability 等。
  实例
  最后,我们来用 goose3 写小一段代码,自动抓取 爱范儿、雷锋网、DoNews 上的新闻文章:
  from goose3 import Goose
from goose3.text import StopWordsChinese
from bs4 import BeautifulSoup
g = Goose({'stopwords_class': StopWordsChinese})
urls = [
   'https://www.ifanr.com/',
   'https://www.leiphone.com/',
   'http://www.donews.com/'
]
url_articles = []
for url in urls:
   page = g.extract(url=url)
   soup = BeautifulSoup(page.raw_html, 'lxml')
   links = soup.find_all('a')
   for l in links:
       link = l.get('href')
       if link and link.startswith('http') and any(c.isdigit() for c in link if c) and link not in url_articles:
           url_articles.append(link)
           print(link)
for url in url_articles:
   try:
       article = g.extract(url=url)
       content = article.cleaned_text
       if len(content) > 200:
           title = article.title
           print(title)
           with open('homework/goose/' + title + '.txt', 'w') as f:
               f.write(content)
   except:
       pass
  这段程序所做的事情就是: 查看全部

  爬虫万金油,一鹅在手,抓遍全球
  爬虫抓取数据有两个头疼的点,写过爬虫的小伙伴们一定都深有体会:
  网站的防抓取机制。你要尽可能将自己伪装成“一个人”,骗过对方的服务器反爬验证。
  网站的内容提取。每个网站都需要你做不同的处理,而且网站一旦改版,你的代码也得跟着更新。
  第一点没什么捷径可走,套路见得多了,也就有经验了。关于第二点,今天咱们就来介绍一个小工具,在某些需求场景下,或许可以给你省不少事。
  Goose
  Goose 是一个文章内容提取器,可以从任意资讯文章类的网页中提取文章主体,并提取标题、标签、摘要、图片、视频等信息,且支持中文网页。它最初是由 用 Java 编写的。python-goose 是用 Python 重写的版本。
  有了这个库,你从网上爬下来的网页可以直接获取正文内容,无需再用 bs4 或正则表达式一个个去处理文本。
  项目地址:
  (py2)
  (py3)
  安装
  网上大多数教程提到的 python-goose 项目目前只支持到 python 2.7。可以通过 pip 安装:
  pip install goose-extractor
  或者安装官网上的方法从源代码安装:
  mkvirtualenv --no-site-packages goose
git clone https://github.com/grangier/python-goose.git
cd python-goose
pip install -r requirements.txt
python setup.py install
  我找到一个 python 3 的版本 goose3:
  pip install goose3
  经过我一些简单的测试,未发现两个版本在结果上有太大的差异。
  快速上手
  这里使用 goose3,而 python-goose 只要把其中的 goose3 改成 goose 即可,接口都是一样的。以我之前发过的一篇文章 为抓取目标来做个演示。
  from goose3 import Goose
from goose3.text import StopWordsChinese
# 初始化,设置中文分词
g = Goose({'stopwords_class': StopWordsChinese})
# 文章地址
url = 'https://mp.weixin.qq.com/s/zflbcF5PS06QC5YJXpiviQ'
# 获取文章内容
article = g.extract(url=url)
# 标题
print('标题:', article.title)
# 显示正文
print(article.cleaned_text)
  输出:
  除了标题 title 和正文 cleaned_text 外,还可以获取一些额外的信息,比如:
  如有有些网站限制了程序抓取,也可以根据需要添加 user-agent 信息:
  
  g = Goose({'browser_user_agent': 'Version/5.1.2 Safari/534.52.7'})
  如果是 goose3,因为使用了 requests 库作为请求模块,因此还可以以相似方式配置 headers、proxies 等属性。
  在上述示例中使用到的 StopWordsChinese 为中文分词器,可一定程度上提高中文文章的识别准确率,但更耗时。
  其他说明
  1.
  Goose 虽然方便,但并不能保证每个网站都能精确获取,因此适合大规模文章的采集,如热点追踪、舆情分析等。它只能从概率上保证大多数网站可以相对准确地抓取。我经过一些尝试后发现,抓取英文网站优于中文网站,主流网站优于小众网站,文本的提取优于图片的提取。
  2.
  从项目中的 requirements.txt 文件可以看出,goose 中使用到了 Pillow、lxml、cssselect、jieba、beautifulsoup、nltk,goose3 还用到了 requests,我们之前很多文章和项目中都有所涉及:
  3.
  如果你是使用基于 python2 的 goose,有可能会遇到编码上的问题(尤其是 windows 上)。这方面可以在公众号对话里回复关键词 编码,我们有过相关的讲解。
  4.
  除了 goose 外,还有其他的正文提取库可以尝试,比如 python-boilerpipe、python-readability 等。
  实例
  最后,我们来用 goose3 写小一段代码,自动抓取 爱范儿、雷锋网、DoNews 上的新闻文章:
  from goose3 import Goose
from goose3.text import StopWordsChinese
from bs4 import BeautifulSoup
g = Goose({'stopwords_class': StopWordsChinese})
urls = [
   'https://www.ifanr.com/',
   'https://www.leiphone.com/',
   'http://www.donews.com/'
]
url_articles = []
for url in urls:
   page = g.extract(url=url)
   soup = BeautifulSoup(page.raw_html, 'lxml')
   links = soup.find_all('a')
   for l in links:
       link = l.get('href')
       if link and link.startswith('http') and any(c.isdigit() for c in link if c) and link not in url_articles:
           url_articles.append(link)
           print(link)
for url in url_articles:
   try:
       article = g.extract(url=url)
       content = article.cleaned_text
       if len(content) > 200:
           title = article.title
           print(title)
           with open('homework/goose/' + title + '.txt', 'w') as f:
               f.write(content)
   except:
       pass
  这段程序所做的事情就是:

c 抓取网页数据 关注:“即使断网

网站优化优采云 发表了文章 • 0 个评论 • 43 次浏览 • 2022-06-25 15:41 • 来自相关话题

  c 抓取网页数据 关注:“即使断网
  知名CMS系统网站搭建商创始人构建第一个Web3.0网站 更喜欢IPFS API而不是亚马逊专有API
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。
  CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  近日,
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth.两者都是ENS 域名。ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD.eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。因此,如果您拥有DNS,则可以使用ENS Domains 网站为.
  第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。从理论上讲,IPFS比传统的网站托管更具弹性。由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  (1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。
  运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。我找到了十几个固定服务,并尝试了以下方法:
  Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。Fleek和Pinata允许您从 Web 浏览器上传文件:
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。
  第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave)访问托管在 IPFS 上的内容。Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  ENS 和 IPFS 是网络的未来吗?
  有各种各样的大缺点:
  我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。撇开缺点不谈,我相信 IPFS 和 ENS 有希望:
  Web3 对开发者意味着什么?
  如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。— Dries Buytaert
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。
  就好比以太坊和以太币一样。任何试图把IPFS和Filecoin分开,或者说独立无关者,要么是对项目的无知,就是混淆视听,另有所图,有着不可告人的目的。
  你的选择,决定你的未来!你选择相信什么,相信谁,就会给你什么样的答案!一切取决于你! 查看全部

  c 抓取网页数据 关注:“即使断网
  知名CMS系统网站搭建商创始人构建第一个Web3.0网站 更喜欢IPFS API而不是亚马逊专有API
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。
  CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  近日,
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth.两者都是ENS 域名。ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD.eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。因此,如果您拥有DNS,则可以使用ENS Domains 网站为.
  第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。从理论上讲,IPFS比传统的网站托管更具弹性。由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  (1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。
  运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。我找到了十几个固定服务,并尝试了以下方法:
  Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。Fleek和Pinata允许您从 Web 浏览器上传文件:
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。
  第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave)访问托管在 IPFS 上的内容。Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  ENS 和 IPFS 是网络的未来吗?
  有各种各样的大缺点:
  我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。撇开缺点不谈,我相信 IPFS 和 ENS 有希望:
  Web3 对开发者意味着什么?
  如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。— Dries Buytaert
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。
  就好比以太坊和以太币一样。任何试图把IPFS和Filecoin分开,或者说独立无关者,要么是对项目的无知,就是混淆视听,另有所图,有着不可告人的目的。
  你的选择,决定你的未来!你选择相信什么,相信谁,就会给你什么样的答案!一切取决于你!

用Python抓取在Github上的组织名称

网站优化优采云 发表了文章 • 0 个评论 • 33 次浏览 • 2022-06-20 13:36 • 来自相关话题

  用Python抓取在Github上的组织名称
  翻译:老齐
  与本文相关书籍推荐:《跟老齐学Python:Django实战》
  
  我想在我的个人网站上展现我在Github上提交代码的组织名称,并且不用我手动更新提交记录的变化。Github提供了读取数据的API,但是,不能体现出我想一些开发组织提交的代码。这就是我之所以要爬取那些信息的原因。本文的代码仓库:
  本文中,我将向你展示一下开发过程。
  准备
  为了能顺利完成本文项目,请安装如下依赖。在当前目录中创建一个名为requirements.txt的文件,打开文本编辑器,把下面的内容复制到该文件中。
  beautifulsoup4==4.9.0<br />lxml==4.5.0<br />requests==2.23.0<br />
  我们使用requests获取网页内容,lxml和beautifulsoup4是另外提取信息的工具。
  如果你不想把你本地的Python环境搞得太复杂,可以创建虚拟环境:
  $ python -m venv .venv<br />$ source .venv/bin/activate<br />
  然后,用pip安装requirements.txt里列出的各项依赖。
  $ python -m pip install -r requirements.txt<br />
  从HTML中找到相应的标签
  首先,你要知道从哪里找到需要的信息。在本例中,我打算获取用户向Github某个特定组织的提交记录,打开用户自己Github页面,滚动如下图所示的地方。
  
  在你的浏览器上用开发和工具,打开HTML源码,并且找到对应的元素。点击某个组织,对应着看到相应源码,在标签内的元素中的就是组织名称。
  我们感兴趣的就在元素里面,所以,要把这个元素的class记录下来,以备后用。
  orgs_nav_classes = "subnav mb-2 d-flex flex-wrap"<br />
  你可能注意到,我忽略了其他的组织名称,后面会演示,那些组织都包含在了我们提取的信息中了。另外,我们使用这个页面上抓取数据,因为HTML代码更可靠,所有的orgs_nav_classes值都一样。
  在工作目录中,创建scrape_github_orgs.py文件,其代码如下:
  # scrape_github_orgs.py<br /><br />import requests<br /><br />from bs4 import BeautifulSoup<br />from bs4.element import ResultSet<br /><br />orgs_nav_classes = "subnav mb-2 d-flex flex-wrap"<br /><br />def get_user_org_hyperlinks(username: str) -> ResultSet:<br /> url = f"https://github.com/users/{username}/contributions"<br /> page = requests.get(url)<br /> soup = BeautifulSoup(page.content, "html.parser")<br /><br /> nav = soup.find("nav", class_=orgs_nav_classes)<br /> tmp_orgs = nav.find_all("a")<br /><br /> return tmp_orgs<br /><br />print(get_user_org_hyperlinks("DahlitzFlorian"))<br />
  首先,引入需要的requests库,还有bs4中的BeautifulSoup。然后,定义函数get_user_org_hyperlinks(),它的参数是username,返回元素的值是 orgs_nav_classes的所有内容。最后一行,调用get_user_org_hyperlinks()函数,并且把结果打印出来。
  执行脚本,得到如下信息:
  $ python scrape-github-orgs.py<br />[<br /><br /> @python<br />, <br /><br /> @deadsnakes<br />, <br /><br /> @realpython<br />, <br /><br />@PyCQA<br />]<br />
  下面进入信息提取阶段。
  提取必要的信息
  记住,我们想获得某个用户提交代码的Github上的组织名称,已经得到了包含组织名称的超链接,然而,其中有很多我们不需要的样式类和属性,接下来就要清除它们,利用lxm包(lxml.html.clean.Cleaner)中的Cleaner()实现这个操作。首先,移除比必要的属性,为此创建一个Cleaner的实例,然后设置实例属性safe_attrs_only=True的值为True,与其关联的属性safe_attrs,利用frozenset创建一个不可变对象,并作为此属性的值。
  from lxml.html import clean<br /><br />cleaner = clean.Cleaner()<br />cleaner.safe_attrs_only = True<br />cleaner.safe_attrs = frozenset(["class", "src", "href", "target"])<br />
  上面的三行代码定义了cleaner对象,但是还没有对HTML采取行动,这要留作后用。接下来,我们要编写一个匹配所有HTML标签的正则表达式,因此要使用Python的re模块。
  import re<br /><br />html_tags = re.compile("")<br />
  最后,开始按照我们的需要实施清除操作。
<p>orgs = []<br /><br />for org in tmp_orgs:<br /> tmp_org = str(org)<br /> org_name = re.sub(<br /> html_tags,<br /> "",<br /> re.search(r" 查看全部

  用Python抓取在Github上的组织名称
  翻译:老齐
  与本文相关书籍推荐:《跟老齐学Python:Django实战》
  
  我想在我的个人网站上展现我在Github上提交代码的组织名称,并且不用我手动更新提交记录的变化。Github提供了读取数据的API,但是,不能体现出我想一些开发组织提交的代码。这就是我之所以要爬取那些信息的原因。本文的代码仓库:
  本文中,我将向你展示一下开发过程。
  准备
  为了能顺利完成本文项目,请安装如下依赖。在当前目录中创建一个名为requirements.txt的文件,打开文本编辑器,把下面的内容复制到该文件中。
  beautifulsoup4==4.9.0<br />lxml==4.5.0<br />requests==2.23.0<br />
  我们使用requests获取网页内容,lxml和beautifulsoup4是另外提取信息的工具。
  如果你不想把你本地的Python环境搞得太复杂,可以创建虚拟环境:
  $ python -m venv .venv<br />$ source .venv/bin/activate<br />
  然后,用pip安装requirements.txt里列出的各项依赖。
  $ python -m pip install -r requirements.txt<br />
  从HTML中找到相应的标签
  首先,你要知道从哪里找到需要的信息。在本例中,我打算获取用户向Github某个特定组织的提交记录,打开用户自己Github页面,滚动如下图所示的地方。
  
  在你的浏览器上用开发和工具,打开HTML源码,并且找到对应的元素。点击某个组织,对应着看到相应源码,在标签内的元素中的就是组织名称。
  我们感兴趣的就在元素里面,所以,要把这个元素的class记录下来,以备后用。
  orgs_nav_classes = "subnav mb-2 d-flex flex-wrap"<br />
  你可能注意到,我忽略了其他的组织名称,后面会演示,那些组织都包含在了我们提取的信息中了。另外,我们使用这个页面上抓取数据,因为HTML代码更可靠,所有的orgs_nav_classes值都一样。
  在工作目录中,创建scrape_github_orgs.py文件,其代码如下:
  # scrape_github_orgs.py<br /><br />import requests<br /><br />from bs4 import BeautifulSoup<br />from bs4.element import ResultSet<br /><br />orgs_nav_classes = "subnav mb-2 d-flex flex-wrap"<br /><br />def get_user_org_hyperlinks(username: str) -> ResultSet:<br /> url = f"https://github.com/users/{username}/contributions"<br /> page = requests.get(url)<br /> soup = BeautifulSoup(page.content, "html.parser")<br /><br /> nav = soup.find("nav", class_=orgs_nav_classes)<br /> tmp_orgs = nav.find_all("a")<br /><br /> return tmp_orgs<br /><br />print(get_user_org_hyperlinks("DahlitzFlorian"))<br />
  首先,引入需要的requests库,还有bs4中的BeautifulSoup。然后,定义函数get_user_org_hyperlinks(),它的参数是username,返回元素的值是 orgs_nav_classes的所有内容。最后一行,调用get_user_org_hyperlinks()函数,并且把结果打印出来。
  执行脚本,得到如下信息:
  $ python scrape-github-orgs.py<br />[<br /><br /> @python<br />, <br /><br /> @deadsnakes<br />, <br /><br /> @realpython<br />, <br /><br />@PyCQA<br />]<br />
  下面进入信息提取阶段。
  提取必要的信息
  记住,我们想获得某个用户提交代码的Github上的组织名称,已经得到了包含组织名称的超链接,然而,其中有很多我们不需要的样式类和属性,接下来就要清除它们,利用lxm包(lxml.html.clean.Cleaner)中的Cleaner()实现这个操作。首先,移除比必要的属性,为此创建一个Cleaner的实例,然后设置实例属性safe_attrs_only=True的值为True,与其关联的属性safe_attrs,利用frozenset创建一个不可变对象,并作为此属性的值。
  from lxml.html import clean<br /><br />cleaner = clean.Cleaner()<br />cleaner.safe_attrs_only = True<br />cleaner.safe_attrs = frozenset(["class", "src", "href", "target"])<br />
  上面的三行代码定义了cleaner对象,但是还没有对HTML采取行动,这要留作后用。接下来,我们要编写一个匹配所有HTML标签的正则表达式,因此要使用Python的re模块。
  import re<br /><br />html_tags = re.compile("")<br />
  最后,开始按照我们的需要实施清除操作。
<p>orgs = []<br /><br />for org in tmp_orgs:<br /> tmp_org = str(org)<br /> org_name = re.sub(<br /> html_tags,<br /> "",<br /> re.search(r"

用chardect库解决网页乱码问题

网站优化优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2022-06-18 12:20 • 来自相关话题

  用chardect库解决网页乱码问题
  写爬虫时经常对网址发起请求,结果返回的html数据除了标签能看懂,其他的全部是乱码。大家如果对爬虫感兴趣,请耐心阅读本文,我们就以百度风雨榜爬虫为例学习下乱码处理问题。
  http://top.baidu.com/buzz?b=1
  
  
  百度风云榜一共有50个关键词,我们先任选其中一个打开看看。
  一、实验目的
  我们的目的是学会使用chardect库,对乱码内容进行处理。本文会以一个具体的例子,通过实战的方式获取正确编码的数据。
  二、代码实战2.1 定位关键词及其链接
  F12键盘打开开发者工具,我们定位关键词及其对应的html标签。在这里我们使用pyquery库定位 class属性为'keyword'的td。
  #百度风云榜页面网址(含有50个热门新闻的关键词)<br />fengyunbang_url = 'http://top.baidu.com/buzz?b=1'<br /><br />resp = requests.get(fengyunbang_url)<br /><br />#从html文件中解析出  事件字段和 网址字段<br />doc = PyQuery(resp.text)<br />for item in doc.items('.keyword'):
   keyword = item('a').text().split(' ')[0]<br />
   keyword_link=item('a').attr.href    <br />    print(keyword,keyword_link)
  运行,结果keyword全部为乱码,没有一点中文的痕迹。
  这就是我们今天要克服的问题-html编码问题。
  遇到这种问题问题,我们可能会先在html标签中查找charset字符集。一般charset值有utf-8、gbk、gb2312、ascii等。
  再次运行,汉字正常显示。
  2.2 定位搜索页面新闻链接
  上面我们获取到了关键词及其链接,浏览器点击“46年吃3万个汉堡”对应的链接,跳转到 百度搜索页,如下图。
  我们想获取新闻内容,而要获取新闻内容,我们就要知道新闻对应的链接。首先我们要定位,如下图。这里我们使用另外一种方式定位链接-正则表达式。
  def get_keywords_news_links(keyword_link):
   """
   访问关键词百度网址,得到相关新闻的link
   :param keyword_link:
   :return:
   """
   headers = {'User-Agent': '你的user-agent'}
   
   resp = requests.get(keyword_link, headers=headers)<br />
   bsObj = BeautifulSoup(resp.text, 'html.parser')<br />
   news_items = bsObj.find_all('div', {'class': 'result c-container '})
   
   news_links = []
   for item in news_items:<br />
       links = re.findall('href="(.*?)"', str(item))<br />
       news_links.extend(links)
   
   #防止链接重复
   news_links = set(news_links)
   return news_links
  但是后来发现有的链接是无法访问的,比如运行中居然抽取出含有***这种的网页,经过测试,只要剔除掉这种链接,剩下的都为有效链接。
  2.3 获取新闻文本内容
  有了上文获取到的链接,我们写个简单的代码获取文本内容。由于获取到的网址来源成百上千的网站,如果要精确获取新闻内容,需要对每一个网站一对一的进行定位。这样太麻烦,为了快速方便,我们使用正则匹配出所有的中文内容。
  def get_news_content(link):
   """
   根据新闻网址,获取新闻数据
   :return:  新闻内容
   """
   resp = requests.get(link)
   #最终只有汉字保留。
   news_text = ''.join(re.findall('[\u4e00-\u9fa5]+', resp.text))<br />
   return news_text
  但是运行过程中,经常返回空。说明正则匹配中文时候匹配不到。很可能的原因是页面中没有中文,但是我们检测了这些页面都是有中文的,那么很有可能是因为页面乱码,导致正则[\u4e00-\u9fa5]+无法匹配到中文。经过检测,真的是乱码。解决办法resp.encoding='编码'。但是编码是什么值呢?这里我用新的方法,chardect库检测二进制数据中采用的编码方式。
  def get_news_content(link):
   """
   根据新闻网址,获取新闻数据
   :return:  新闻内容
   """
   resp = requests.get(link)
   news_text = ''.join(re.findall('[\u4e00-\u9fa5]+',
   resp.text))
   
   #网页乱码,导致news_text为空
   if not news_text:
       #根据二进制数据检测html的编码。resp.content获取html二进制数据
       encoding = resp.content['encoding']
       chaset = chardet.detect(encoding)
       #解决编码问题
       resp.encoding = chaset
       news_text = ''.join(re.findall('[\u4e00-\u9fa5]+', resp.text))
       <br />        return news_text    <br />    return news_text
  2.4 编写爬虫主函数
  编写爬虫主函数,将数据保存到csv中。
  #主函数,访问并保存所有的新闻数据<br />def FetchAndSave():
   #百度风云榜页面网址(含有50个热门新闻的关键词)
   fengyunbang_url = 'http://top.baidu.com/buzz?b=1'
   resp = requests.get(fengyunbang_url)
   resp.encoding='gb2312'
   #新建excel文件保存数据。
   csvf = open('data.csv', 'a+', encoding='gbk', newline='') as csvf
                           
   writer = csv.writer(csvf)
   writer.writerow(('news_content', 'keyword'))
   #从heml文件中解析出  事件字段和 网址字段
   doc = PyQuery(resp.text)
   for item in doc.items('.keyword'):
       keyword = item('a').text().split(' ')[0]<br />
       keyword_link = item('a').attr.href
       news_links = get_keywords_news_links(keyword_link)<br />
       for news_link in news_links:
           try:
               content = get_news_content(news_link)
               #防止空内容写入csv中
               if content:
                   writer.writerow((content, keyword))
           except:
               print(news_link)<br /><br /><br />#运行爬虫<br />FetchAndSave()
  运行爬虫,采集了50个关键词共388篇新闻内容。
  
  有问题,问大邓
  项目代码链接: 密码: sqfb
  往期文章 查看全部

  用chardect库解决网页乱码问题
  写爬虫时经常对网址发起请求,结果返回的html数据除了标签能看懂,其他的全部是乱码。大家如果对爬虫感兴趣,请耐心阅读本文,我们就以百度风雨榜爬虫为例学习下乱码处理问题。
  http://top.baidu.com/buzz?b=1
  
  
  百度风云榜一共有50个关键词,我们先任选其中一个打开看看。
  一、实验目的
  我们的目的是学会使用chardect库,对乱码内容进行处理。本文会以一个具体的例子,通过实战的方式获取正确编码的数据。
  二、代码实战2.1 定位关键词及其链接
  F12键盘打开开发者工具,我们定位关键词及其对应的html标签。在这里我们使用pyquery库定位 class属性为'keyword'的td。
  #百度风云榜页面网址(含有50个热门新闻的关键词)<br />fengyunbang_url = 'http://top.baidu.com/buzz?b=1'<br /><br />resp = requests.get(fengyunbang_url)<br /><br />#从html文件中解析出  事件字段和 网址字段<br />doc = PyQuery(resp.text)<br />for item in doc.items('.keyword'):
   keyword = item('a').text().split(' ')[0]<br />
   keyword_link=item('a').attr.href    <br />    print(keyword,keyword_link)
  运行,结果keyword全部为乱码,没有一点中文的痕迹。
  这就是我们今天要克服的问题-html编码问题。
  遇到这种问题问题,我们可能会先在html标签中查找charset字符集。一般charset值有utf-8、gbk、gb2312、ascii等。
  再次运行,汉字正常显示。
  2.2 定位搜索页面新闻链接
  上面我们获取到了关键词及其链接,浏览器点击“46年吃3万个汉堡”对应的链接,跳转到 百度搜索页,如下图。
  我们想获取新闻内容,而要获取新闻内容,我们就要知道新闻对应的链接。首先我们要定位,如下图。这里我们使用另外一种方式定位链接-正则表达式。
  def get_keywords_news_links(keyword_link):
   """
   访问关键词百度网址,得到相关新闻的link
   :param keyword_link:
   :return:
   """
   headers = {'User-Agent': '你的user-agent'}
   
   resp = requests.get(keyword_link, headers=headers)<br />
   bsObj = BeautifulSoup(resp.text, 'html.parser')<br />
   news_items = bsObj.find_all('div', {'class': 'result c-container '})
   
   news_links = []
   for item in news_items:<br />
       links = re.findall('href="(.*?)"', str(item))<br />
       news_links.extend(links)
   
   #防止链接重复
   news_links = set(news_links)
   return news_links
  但是后来发现有的链接是无法访问的,比如运行中居然抽取出含有***这种的网页,经过测试,只要剔除掉这种链接,剩下的都为有效链接。
  2.3 获取新闻文本内容
  有了上文获取到的链接,我们写个简单的代码获取文本内容。由于获取到的网址来源成百上千的网站,如果要精确获取新闻内容,需要对每一个网站一对一的进行定位。这样太麻烦,为了快速方便,我们使用正则匹配出所有的中文内容。
  def get_news_content(link):
   """
   根据新闻网址,获取新闻数据
   :return:  新闻内容
   """
   resp = requests.get(link)
   #最终只有汉字保留。
   news_text = ''.join(re.findall('[\u4e00-\u9fa5]+', resp.text))<br />
   return news_text
  但是运行过程中,经常返回空。说明正则匹配中文时候匹配不到。很可能的原因是页面中没有中文,但是我们检测了这些页面都是有中文的,那么很有可能是因为页面乱码,导致正则[\u4e00-\u9fa5]+无法匹配到中文。经过检测,真的是乱码。解决办法resp.encoding='编码'。但是编码是什么值呢?这里我用新的方法,chardect库检测二进制数据中采用的编码方式。
  def get_news_content(link):
   """
   根据新闻网址,获取新闻数据
   :return:  新闻内容
   """
   resp = requests.get(link)
   news_text = ''.join(re.findall('[\u4e00-\u9fa5]+',
   resp.text))
   
   #网页乱码,导致news_text为空
   if not news_text:
       #根据二进制数据检测html的编码。resp.content获取html二进制数据
       encoding = resp.content['encoding']
       chaset = chardet.detect(encoding)
       #解决编码问题
       resp.encoding = chaset
       news_text = ''.join(re.findall('[\u4e00-\u9fa5]+', resp.text))
       <br />        return news_text    <br />    return news_text
  2.4 编写爬虫主函数
  编写爬虫主函数,将数据保存到csv中。
  #主函数,访问并保存所有的新闻数据<br />def FetchAndSave():
   #百度风云榜页面网址(含有50个热门新闻的关键词)
   fengyunbang_url = 'http://top.baidu.com/buzz?b=1'
   resp = requests.get(fengyunbang_url)
   resp.encoding='gb2312'
   #新建excel文件保存数据。
   csvf = open('data.csv', 'a+', encoding='gbk', newline='') as csvf
                           
   writer = csv.writer(csvf)
   writer.writerow(('news_content', 'keyword'))
   #从heml文件中解析出  事件字段和 网址字段
   doc = PyQuery(resp.text)
   for item in doc.items('.keyword'):
       keyword = item('a').text().split(' ')[0]<br />
       keyword_link = item('a').attr.href
       news_links = get_keywords_news_links(keyword_link)<br />
       for news_link in news_links:
           try:
               content = get_news_content(news_link)
               #防止空内容写入csv中
               if content:
                   writer.writerow((content, keyword))
           except:
               print(news_link)<br /><br /><br />#运行爬虫<br />FetchAndSave()
  运行爬虫,采集了50个关键词共388篇新闻内容。
  
  有问题,问大邓
  项目代码链接: 密码: sqfb
  往期文章

c 抓取网页数据 关注:“即使断网

网站优化优采云 发表了文章 • 0 个评论 • 46 次浏览 • 2022-06-18 12:18 • 来自相关话题

  c 抓取网页数据 关注:“即使断网
  知名CMS系统网站搭建商创始人构建第一个Web3.0网站 更喜欢IPFS API而不是亚马逊专有API
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。
  CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  
  近日,
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth.两者都是ENS 域名。ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD.eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。因此,如果您拥有DNS,则可以使用ENS Domains 网站为.
  第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。从理论上讲,IPFS比传统的网站托管更具弹性。由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  (1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。
  运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  
  
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。我找到了十几个固定服务,并尝试了以下方法:
  Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。Fleek和Pinata允许您从 Web 浏览器上传文件:
  
  
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。
  第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave)访问托管在 IPFS 上的内容。Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  
  ENS 和 IPFS 是网络的未来吗?
  有各种各样的大缺点:
  我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。撇开缺点不谈,我相信 IPFS 和 ENS 有希望:
  Web3 对开发者意味着什么?
  如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。— Dries Buytaert
  
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。
  就好比以太坊和以太币一样。任何试图把IPFS和Filecoin分开,或者说独立无关者,要么是对项目的无知,就是混淆视听,另有所图,有着不可告人的目的。
  你的选择,决定你的未来!你选择相信什么,相信谁,就会给你什么样的答案!一切取决于你! 查看全部

  c 抓取网页数据 关注:“即使断网
  知名CMS系统网站搭建商创始人构建第一个Web3.0网站 更喜欢IPFS API而不是亚马逊专有API
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。
  CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  
  近日,
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth.两者都是ENS 域名。ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD.eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。因此,如果您拥有DNS,则可以使用ENS Domains 网站为.
  第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。从理论上讲,IPFS比传统的网站托管更具弹性。由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  (1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。
  运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  
  
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。我找到了十几个固定服务,并尝试了以下方法:
  Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。Fleek和Pinata允许您从 Web 浏览器上传文件:
  
  
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。
  第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave)访问托管在 IPFS 上的内容。Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  
  ENS 和 IPFS 是网络的未来吗?
  有各种各样的大缺点:
  我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。撇开缺点不谈,我相信 IPFS 和 ENS 有希望:
  Web3 对开发者意味着什么?
  如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。— Dries Buytaert
  
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。
  就好比以太坊和以太币一样。任何试图把IPFS和Filecoin分开,或者说独立无关者,要么是对项目的无知,就是混淆视听,另有所图,有着不可告人的目的。
  你的选择,决定你的未来!你选择相信什么,相信谁,就会给你什么样的答案!一切取决于你!

c 抓取网页数据 “即使断网

网站优化优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2022-06-18 12:12 • 来自相关话题

  c 抓取网页数据 “即使断网
  Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  
  近日,全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth.两者都是ENS 域名。ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD.eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。因此,如果您拥有DNS,则可以使用ENS Domains 网站为.第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。从理论上讲,IPFS比传统的网站托管更具弹性。
  由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  (1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  
  
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。我找到了十几个固定服务,并尝试了以下方法:Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。Fleek和Pinata允许您从 Web 浏览器上传文件:
  
  
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave)访问托管在 IPFS 上的内容。Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  
  ENS 和 IPFS 是网络的未来吗?有各种各样的大缺点:我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。撇开缺点不谈,我相信 IPFS 和 ENS 有希望:Web3 对开发者意味着什么?如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。Web3 的承诺是什么?我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。— Dries Buytaert
  
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。 查看全部

  c 抓取网页数据 “即使断网
  Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  
  近日,全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth.两者都是ENS 域名。ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD.eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。因此,如果您拥有DNS,则可以使用ENS Domains 网站为.第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。从理论上讲,IPFS比传统的网站托管更具弹性。
  由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  (1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  
  
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。我找到了十几个固定服务,并尝试了以下方法:Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。Fleek和Pinata允许您从 Web 浏览器上传文件:
  
  
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave)访问托管在 IPFS 上的内容。Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  
  ENS 和 IPFS 是网络的未来吗?有各种各样的大缺点:我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。撇开缺点不谈,我相信 IPFS 和 ENS 有希望:Web3 对开发者意味着什么?如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。Web3 的承诺是什么?我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。— Dries Buytaert
  
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。

初学指南| 用Python进行网页抓取

网站优化优采云 发表了文章 • 0 个评论 • 37 次浏览 • 2022-06-17 15:22 • 来自相关话题

  初学指南| 用Python进行网页抓取
  
  关于转载授权
  大数据文摘作品,欢迎个人转发朋友圈,自媒体、媒体、机构转载务必申请授权,后台留言“机构名称+转载”,申请过授权的不必再次申请,只要按约定转载即可,但文末需放置大数据文摘二维码。
  编译|丁雪 黄念程序注释|席雄芬校对|姚佳灵
  引言
  从网页中提取信息的需求日益剧增,其重要性也越来越明显。每隔几周,我自己就想要到网页上提取一些信息。比如上周我们考虑建立一个有关各种数据科学在线课程的欢迎程度和意见的索引。我们不仅需要找出新的课程,还要抓取对课程的评论,对它们进行总结后建立一些衡量指标。这是一个问题或产品,其功效更多地取决于网页抓取和信息提取(数据集)的技术,而非以往我们使用的数据汇总技术。
  网页信息提取的方式
  从网页中提取信息有一些方法。使用API可能被认为是从网站提取信息的最佳方法。几乎所有的大型网站,像Twitter、Facebook、Google、Twitter、StackOverflow都提供API以更为结构化的方式访问该网站的数据。如果可以直接通过API得到所需要的信息,那么这个方法几乎总是优于网页抓取方法。因为如果可以从数据提供方得到结构化的数据,为什么还要自己建立一个引擎来提取同样的数据?
  不幸的是,并不是所有的网站都提供API。一些网站是不愿意让读者通过结构化的方式抓取大量的信息,另一些网站是因为缺乏相关的技术知识而不能提供API。在这样的情况下,该怎么做?好吧,我们需要通过网页抓取来获得数据。
  当然还有一些像RSS订阅等的其它方式,但是由于使用上的限制,因此我将不在这里讨论它们。
  
  什么是网页抓取?
  网页抓取是一种从网站中获取信息的计算机软件技术。这种技术主要聚焦于把网络中的非结构化数据(HTML 格式)转变成结构化数据(数据库或电子表格)。
  可以用不同的方式实施网页抓取,包括从Google Docs到几乎所有的编程语言。由于Python的易用性和丰富的生态系统,我会选择使用Python。Python中的BeautifulSoup库可以协助完成这一任务。在本文中,我将会利用Python编程语言给你看学习网页抓取最简单的方式。
  对于需要借助非编程方式提取网页数据的读者,可以去import.io上看看。那上面有基于图形用户界面的驱动来运行网页抓取的基础操作,计算机迷们可以继续看本文!
  网页抓取所需要的库
  我们都知道Python是一门开源编程语言。你也许能找到很多库来实施一个功能。因此,找出最好的库是非常必要的。我倾向于使用BeautifulSoup (Python库),因为它的使用简单直观。准确地说,我会用到两个Python模块来抓取数据:
  •Urllib2:它是一个Python模块,用来获取URL。它定义函数和类,实现URL操作(基本、摘要式身份验证、重定向、cookies等)欲了解更多详情,请参阅文档页面。
  •BeautifulSoup:它是一个神奇的工具,用来从网页中提取信息。可以用它从网页中提取表格、列表、段落,也可以加上过滤器。在本文中,我们将会用最新版本,BeautifulSoup 4。可以在它的文档页面查看安装指南。
  BeautifulSoup不帮我们获取网页,这是我将urllib2和BeautifulSoup 库一起使用的原因。除了BeautifulSoup之外,Python还有其它一些方法用于HTML的抓取。如:
  •mechanize
  •scrapemark
  •scrapy
  基础-熟悉HTML(标签)
  在进行网页抓取时,我们需要处理html标签。因此,我们必须先好好理解一下标签。如果已经了解HTML的基础知识,可以跳过这一节。以下是HTML的基本语法:
  
  该语法的各种标签的解释如下:
  1.:html文档必须以类型声明开始
  2.html文档写在 和标签之间
  3.html文档的可见部分写在 和标签之间
  4.html头使用 到 标签定义
  5.html段落使用
  标签定义
  其它有用的HTML标签是:
  1.html链接使用标签定义,“这是一个测试链接.com”
  2.html表格使用定义,行用表示,行用分为数据
  
  3.html列表以(无序)和(有序)开始,列表中的每个元素以开始
  如果不熟悉这些HTML标签,我建议到W3schools上学习HTML教程。这样对HTML标签会有个清楚的理解。
  使用BeautifulSoup抓取网页
  在这里,我将从维基百科页面上抓取数据。我们的最终目的是抓取印度的邦、联邦首府的列表,以及一些基本细节,如成立信息、前首府和其它组成这个维基百科页面的信息。让我们一步一步做这个项目来学习:
  1.导入必要的库
  2.使用“prettify”函数来看HTML页面的嵌套结构
  
  如上所示,可以看到HTML标签的结构。这将有助于了解不同的可用标签,从而明白如何使用它们来抓取信息。
  3.处理HTML标签
  a.soup.:返回在开始和结束标签之间的内容,包括标签在内。
  
  
  b.soup..string: 返回给定标签内的字符串
  
  c.找出在标签内的链接:我们知道,我们可以用标签标记一个链接。因此,我们应该利用soup.a 选项,它应该返回在网页内可用的链接。我们来做一下。
  
  如上所示,可以看到只有一个结果。现在,我们将使用“find_all()”来抓取中的所有链接。
  上面显示了所有的链接,包括标题、链接和其它信息。现在,为了只显示链接,我们需要使用get的“href”属性:遍历每一个标签,然后再返回链接。
  
  4.找到正确的表:当我们在找一个表以抓取邦首府的信息时,我们应该首先找出正确的表。让我们写指令来抓取所有表标签中的信息。
  
  现在为了找出正确的表,我们将使用表的属性“class(类)”,并用它来筛选出正确的表。在chrome浏览器中,可以通过在所需的网页表格上单击右键来查询其类名–>检查元素–>复制该类名或通过上述命令的输出找到正确的表的类名。
  
  
  5.提取信息放入DataFrame:在这里,我们要遍历每一行(tr),然后将tr的每个元素(td)赋给一个变量,将它添加到列表中。让我们先看看表格的HTML结构(我不想抓取表格标题的信息)
  如上所示,你会注意到的第二个元素在< th >标签内,而不在标签内。因此,对这一点我们需要小心。现在要访问每个元素的值,我们会使用每个元素的“find(text=True)”选项。让我们看一下代码:
  
  
  
  
  最后,我们在dataframe内的数据如下:
  
  类似地,可以用BeautifulSoup实施各种其它类型的网页抓取。这将减轻从网页上手工收集数据的工作。也可以看下其它属性,如.parent,.contents,.descendants 和.next_sibling,.prev_sibling以及各种用于标签名称浏览的属性。这些将有助于您有效地抓取网页。
  但是,为什么我不能只使用正则表达式(Regular Expressions)?
  现在,如果知道正则表达式,你可能会认为可以用它来编写代码做同样的事情。当然,我也有过这个问题。我曾使用BeautifulSoup和正则表达式来做同样的事情,结果发现:
  BeautifulSoup里的代码比用正则表达式写的更强大。用正则表达式编写的代码得随着页面中的变动而进行更改。即使BeautifulSoup在一些情况下需要调整,但相对来讲,BeautifulSoup较好一些。
  正则表达式比BeautifulSoup快得多,对于相同的结果,正则表达式比BeautifulSoup快100倍。
  因此,它归结为速度与代码的鲁棒性之间的比较,这里没有万能的赢家。如果正在寻找的信息可以用简单的正则表达式语句抓取,那么应该选择使用它们。对于几乎所有复杂的工作,我通常更多地建议使用BeautifulSoup,而不是正则表达式。
  结语
  本文中,我们使用了Python的两个库BeautifulSoup和urllib2。我们也了解了HTML的基础知识,并通过解决一个问题,一步一步地实施网页抓取。我建议你练习一下并用它来从网页中搜集数据。
  译者简介丁雪华中师范大学情报学专业硕士,从事用户行为与个性化服务方向的研究。关注大数据的发展,欲从事互联网与咨询行业的相关工作。黄念上海长海医院在读硕士,对生物医药大数据挖掘的及其应用很感兴趣,愿意借助本平台认识更多的小伙伴。席雄芬北京邮电大学无线信号处理专业研究生在读,主要研究图信号处理,对基于社交网络的图数据挖掘感兴趣,希望借助此平台能认识更多的从事大数据方面的人,结交更多的志同道合者。姚佳灵家庭主妇,对数据分析和处理很感兴趣,正在努力学习中,希望能和大家多交流。
  
  【限时干货下载】
  2015/11/30前
  2015年10月干货文件打包下载,请点击大数据文摘底部菜单:下载等--10月下载
  大数据文摘精彩文章:
  回复【金融】 看【金融与商业】专栏历史期刊文章
  回复【可视化】感受技术与艺术的完美结合
  回复【安全】 关于泄密、黑客、攻防的新鲜案例
  回复【算法】 既涨知识又有趣的人和事
  回复【谷歌】 看其在大数据领域的举措
  回复【院士】 看众多院士如何讲大数据
  回复【隐私】 看看在大数据时代还有多少隐私
  回复【医疗】 查看医疗领域文章6篇 查看全部

  初学指南| 用Python进行网页抓取
  
  关于转载授权
  大数据文摘作品,欢迎个人转发朋友圈,自媒体、媒体、机构转载务必申请授权,后台留言“机构名称+转载”,申请过授权的不必再次申请,只要按约定转载即可,但文末需放置大数据文摘二维码。
  编译|丁雪 黄念程序注释|席雄芬校对|姚佳灵
  引言
  从网页中提取信息的需求日益剧增,其重要性也越来越明显。每隔几周,我自己就想要到网页上提取一些信息。比如上周我们考虑建立一个有关各种数据科学在线课程的欢迎程度和意见的索引。我们不仅需要找出新的课程,还要抓取对课程的评论,对它们进行总结后建立一些衡量指标。这是一个问题或产品,其功效更多地取决于网页抓取和信息提取(数据集)的技术,而非以往我们使用的数据汇总技术。
  网页信息提取的方式
  从网页中提取信息有一些方法。使用API可能被认为是从网站提取信息的最佳方法。几乎所有的大型网站,像Twitter、Facebook、Google、Twitter、StackOverflow都提供API以更为结构化的方式访问该网站的数据。如果可以直接通过API得到所需要的信息,那么这个方法几乎总是优于网页抓取方法。因为如果可以从数据提供方得到结构化的数据,为什么还要自己建立一个引擎来提取同样的数据?
  不幸的是,并不是所有的网站都提供API。一些网站是不愿意让读者通过结构化的方式抓取大量的信息,另一些网站是因为缺乏相关的技术知识而不能提供API。在这样的情况下,该怎么做?好吧,我们需要通过网页抓取来获得数据。
  当然还有一些像RSS订阅等的其它方式,但是由于使用上的限制,因此我将不在这里讨论它们。
  
  什么是网页抓取?
  网页抓取是一种从网站中获取信息的计算机软件技术。这种技术主要聚焦于把网络中的非结构化数据(HTML 格式)转变成结构化数据(数据库或电子表格)。
  可以用不同的方式实施网页抓取,包括从Google Docs到几乎所有的编程语言。由于Python的易用性和丰富的生态系统,我会选择使用Python。Python中的BeautifulSoup库可以协助完成这一任务。在本文中,我将会利用Python编程语言给你看学习网页抓取最简单的方式。
  对于需要借助非编程方式提取网页数据的读者,可以去import.io上看看。那上面有基于图形用户界面的驱动来运行网页抓取的基础操作,计算机迷们可以继续看本文!
  网页抓取所需要的库
  我们都知道Python是一门开源编程语言。你也许能找到很多库来实施一个功能。因此,找出最好的库是非常必要的。我倾向于使用BeautifulSoup (Python库),因为它的使用简单直观。准确地说,我会用到两个Python模块来抓取数据:
  •Urllib2:它是一个Python模块,用来获取URL。它定义函数和类,实现URL操作(基本、摘要式身份验证、重定向、cookies等)欲了解更多详情,请参阅文档页面。
  •BeautifulSoup:它是一个神奇的工具,用来从网页中提取信息。可以用它从网页中提取表格、列表、段落,也可以加上过滤器。在本文中,我们将会用最新版本,BeautifulSoup 4。可以在它的文档页面查看安装指南。
  BeautifulSoup不帮我们获取网页,这是我将urllib2和BeautifulSoup 库一起使用的原因。除了BeautifulSoup之外,Python还有其它一些方法用于HTML的抓取。如:
  •mechanize
  •scrapemark
  •scrapy
  基础-熟悉HTML(标签)
  在进行网页抓取时,我们需要处理html标签。因此,我们必须先好好理解一下标签。如果已经了解HTML的基础知识,可以跳过这一节。以下是HTML的基本语法:
  
  该语法的各种标签的解释如下:
  1.:html文档必须以类型声明开始
  2.html文档写在 和标签之间
  3.html文档的可见部分写在 和标签之间
  4.html头使用 到 标签定义
  5.html段落使用
  标签定义
  其它有用的HTML标签是:
  1.html链接使用标签定义,“这是一个测试链接.com”
  2.html表格使用定义,行用表示,行用分为数据
  
  3.html列表以(无序)和(有序)开始,列表中的每个元素以开始
  如果不熟悉这些HTML标签,我建议到W3schools上学习HTML教程。这样对HTML标签会有个清楚的理解。
  使用BeautifulSoup抓取网页
  在这里,我将从维基百科页面上抓取数据。我们的最终目的是抓取印度的邦、联邦首府的列表,以及一些基本细节,如成立信息、前首府和其它组成这个维基百科页面的信息。让我们一步一步做这个项目来学习:
  1.导入必要的库
  2.使用“prettify”函数来看HTML页面的嵌套结构
  
  如上所示,可以看到HTML标签的结构。这将有助于了解不同的可用标签,从而明白如何使用它们来抓取信息。
  3.处理HTML标签
  a.soup.:返回在开始和结束标签之间的内容,包括标签在内。
  
  
  b.soup..string: 返回给定标签内的字符串
  
  c.找出在标签内的链接:我们知道,我们可以用标签标记一个链接。因此,我们应该利用soup.a 选项,它应该返回在网页内可用的链接。我们来做一下。
  
  如上所示,可以看到只有一个结果。现在,我们将使用“find_all()”来抓取中的所有链接。
  上面显示了所有的链接,包括标题、链接和其它信息。现在,为了只显示链接,我们需要使用get的“href”属性:遍历每一个标签,然后再返回链接。
  
  4.找到正确的表:当我们在找一个表以抓取邦首府的信息时,我们应该首先找出正确的表。让我们写指令来抓取所有表标签中的信息。
  
  现在为了找出正确的表,我们将使用表的属性“class(类)”,并用它来筛选出正确的表。在chrome浏览器中,可以通过在所需的网页表格上单击右键来查询其类名–>检查元素–>复制该类名或通过上述命令的输出找到正确的表的类名。
  
  
  5.提取信息放入DataFrame:在这里,我们要遍历每一行(tr),然后将tr的每个元素(td)赋给一个变量,将它添加到列表中。让我们先看看表格的HTML结构(我不想抓取表格标题的信息)
  如上所示,你会注意到的第二个元素在< th >标签内,而不在标签内。因此,对这一点我们需要小心。现在要访问每个元素的值,我们会使用每个元素的“find(text=True)”选项。让我们看一下代码:
  
  
  
  
  最后,我们在dataframe内的数据如下:
  
  类似地,可以用BeautifulSoup实施各种其它类型的网页抓取。这将减轻从网页上手工收集数据的工作。也可以看下其它属性,如.parent,.contents,.descendants 和.next_sibling,.prev_sibling以及各种用于标签名称浏览的属性。这些将有助于您有效地抓取网页。
  但是,为什么我不能只使用正则表达式(Regular Expressions)?
  现在,如果知道正则表达式,你可能会认为可以用它来编写代码做同样的事情。当然,我也有过这个问题。我曾使用BeautifulSoup和正则表达式来做同样的事情,结果发现:
  BeautifulSoup里的代码比用正则表达式写的更强大。用正则表达式编写的代码得随着页面中的变动而进行更改。即使BeautifulSoup在一些情况下需要调整,但相对来讲,BeautifulSoup较好一些。
  正则表达式比BeautifulSoup快得多,对于相同的结果,正则表达式比BeautifulSoup快100倍。
  因此,它归结为速度与代码的鲁棒性之间的比较,这里没有万能的赢家。如果正在寻找的信息可以用简单的正则表达式语句抓取,那么应该选择使用它们。对于几乎所有复杂的工作,我通常更多地建议使用BeautifulSoup,而不是正则表达式。
  结语
  本文中,我们使用了Python的两个库BeautifulSoup和urllib2。我们也了解了HTML的基础知识,并通过解决一个问题,一步一步地实施网页抓取。我建议你练习一下并用它来从网页中搜集数据。
  译者简介丁雪华中师范大学情报学专业硕士,从事用户行为与个性化服务方向的研究。关注大数据的发展,欲从事互联网与咨询行业的相关工作。黄念上海长海医院在读硕士,对生物医药大数据挖掘的及其应用很感兴趣,愿意借助本平台认识更多的小伙伴。席雄芬北京邮电大学无线信号处理专业研究生在读,主要研究图信号处理,对基于社交网络的图数据挖掘感兴趣,希望借助此平台能认识更多的从事大数据方面的人,结交更多的志同道合者。姚佳灵家庭主妇,对数据分析和处理很感兴趣,正在努力学习中,希望能和大家多交流。
  
  【限时干货下载】
  2015/11/30前
  2015年10月干货文件打包下载,请点击大数据文摘底部菜单:下载等--10月下载
  大数据文摘精彩文章:
  回复【金融】 看【金融与商业】专栏历史期刊文章
  回复【可视化】感受技术与艺术的完美结合
  回复【安全】 关于泄密、黑客、攻防的新鲜案例
  回复【算法】 既涨知识又有趣的人和事
  回复【谷歌】 看其在大数据领域的举措
  回复【院士】 看众多院士如何讲大数据
  回复【隐私】 看看在大数据时代还有多少隐私
  回复【医疗】 查看医疗领域文章6篇

o模拟浏览器和gmail客户端模拟消息栏发送信息

网站优化优采云 发表了文章 • 0 个评论 • 38 次浏览 • 2022-06-13 12:06 • 来自相关话题

  o模拟浏览器和gmail客户端模拟消息栏发送信息
  c抓取网页数据。b模拟浏览器和gmail客户端模拟消息栏发送信息,c使用qq对邮件文本进行判断,b模拟qq查找附件。e通过抓包模拟登录网页版进行登录验证。f从gmail中抓取中文姓名验证码。g解析邮件内容然后从邮件系统发送给qq客户端,模拟登录后发送邮件数据至对应的qq邮箱客户端。h从网页抓取验证码图片。o模拟gmail收发短信验证码数据。
  有点意思的问题,我用c写了一个不是很了解的http库,作为一个http模拟登录函数:commonhttpdhttprequestgetcmpgetbackwards都可以生成msg对象,它们可以用来构造请求中的cookie和重定向中的cookie,从而作为request的一个部分发送给response,从而可以把多个session绑定起来。
  方法httprequestcookiebackwardsrequest{requestheaders}这样处理下来,假设模拟登录是普通登录,你可以封装一个webview:commonhttpd::webviewwebview.urlrequest(url,status=200);size=request.format(request.status_code).touch();//过滤浏览器-webview中模拟getcmpcookiebackwards{classrequest1extendscommonhttpd::webview{staticgetcmp(url,null)returnnull;}statichandlererror(requesttarget,status,error,errortext)extendsurlrequest{classcookiebackwardsextendsboolean{cookiebackwards(url,target);}}}webview.urlrequest(url,status,error,errortext);querysetmsg2getmessage(status,request,msg,error,errortext){returnthis.request.urlrequest(msg,request.get(url)).body();}。 查看全部

  o模拟浏览器和gmail客户端模拟消息栏发送信息
  c抓取网页数据。b模拟浏览器和gmail客户端模拟消息栏发送信息,c使用qq对邮件文本进行判断,b模拟qq查找附件。e通过抓包模拟登录网页版进行登录验证。f从gmail中抓取中文姓名验证码。g解析邮件内容然后从邮件系统发送给qq客户端,模拟登录后发送邮件数据至对应的qq邮箱客户端。h从网页抓取验证码图片。o模拟gmail收发短信验证码数据。
  有点意思的问题,我用c写了一个不是很了解的http库,作为一个http模拟登录函数:commonhttpdhttprequestgetcmpgetbackwards都可以生成msg对象,它们可以用来构造请求中的cookie和重定向中的cookie,从而作为request的一个部分发送给response,从而可以把多个session绑定起来。
  方法httprequestcookiebackwardsrequest{requestheaders}这样处理下来,假设模拟登录是普通登录,你可以封装一个webview:commonhttpd::webviewwebview.urlrequest(url,status=200);size=request.format(request.status_code).touch();//过滤浏览器-webview中模拟getcmpcookiebackwards{classrequest1extendscommonhttpd::webview{staticgetcmp(url,null)returnnull;}statichandlererror(requesttarget,status,error,errortext)extendsurlrequest{classcookiebackwardsextendsboolean{cookiebackwards(url,target);}}}webview.urlrequest(url,status,error,errortext);querysetmsg2getmessage(status,request,msg,error,errortext){returnthis.request.urlrequest(msg,request.get(url)).body();}。

Selenium抓取动态网页数据

网站优化优采云 发表了文章 • 0 个评论 • 42 次浏览 • 2022-06-11 19:19 • 来自相关话题

  Selenium抓取动态网页数据

  1.selenium抓取动态网页数据基础介绍1.1 什么是AJAXAJAX(Asynchronouse JavaScript And XML:异步JavaScript和XML)通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行局部更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。因为传统的网页在传输数据格式方面,使用的是XML语法,因此叫做AJAX,其实现在数据交互基本上都是使用JSON。使用AJAX加载的数据,即使使用了JS将数据渲染到了浏览器中,在右键->查看网页源代码还是不能看到通过ajax加载的数据,只能看到使用这个url加载的html代码。1.2 获取ajax数据的方式法1:直接分析ajax调用的接口。然后通过代码请求这个接口。法2:使用Selenium+chromedriver模拟浏览器行为获取数据。
  方式
  优点
  缺点
  分析接口
  直接可以请求到数据。不需要做一些解析工作。代码量少,性能高。
  分析接口比较复杂,特别是一些通过js混淆的接口,要有一定的js功底。容易被发现是爬虫。
  selenium
  直接模拟浏览器的行为。浏览器能请求到的,使用selenium也能请求到。爬虫更稳定。
  代码量多。性能低。
  1.3 Selenium+chromedriver获取动态数据Selenium相当于是一个机器人。可以模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等。chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:Chrome:Firefox:Edge:Safari:1.4 安装Selenium和chromedriver安装Selenium:Selenium有很多语言的版本,有java、ruby、python等。我们下载python版本的就可以了。
   pip install selenium
  安装chromedriver:下载完成后,放到不需要权限的纯英文目录下就可以了。1.5 快速入门现在以一个简单的获取百度首页的例子来讲下Selenium和chromedriver如何快速入门:
  from selenium import webdriver<br /># chromedriver的绝对路径driver_path = r'D:\ProgramApp\chromedriver\chromedriver.exe'<br /># 初始化一个driver,并且指定chromedriver的路径driver = webdriver.Chrome(executable_path=driver_path)# 请求网页driver.get("https://www.baidu.com/")# 通过page_source获取网页源代码print(driver.page_source)
  1.6 selenium常用操作
  1.7 爬取拉钩网职位信息
  直接直接分析ajax调用的接口爬取
  import requestsfrom lxml import etreeimport timeimport re<br /><br />headers = { "Accept":"application/json, text/javascript, */*; q=0.01", "Accept-Encoding":"gzip, deflate, br", "Accept-Language":"zh-CN,zh;q=0.9", "Connection":"keep-alive", "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", "Referer":"https://www.lagou.com/jobs/lis ... ot%3B, "Origin":"https://www.lagou.com", "Host":"www.lagou.com", "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8", "Cookie":"_ga=GA1.2.1602115737.1553064534; user_trace_token=20190320144853-39b1375a-4adc-11e9-a253-525400f775ce; LGUID=20190320144853-39b13f88-4adc-11e9-a253-525400f775ce; WEBTJ-ID=20190408120043-169fb1afd63488-06179b118ca307-7a1437-2073600-169fb1afd648ed; _gid=GA1.2.1826141825.1554696044; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22169fb1bb2c41ea-04951e55adc96a-7a1437-2073600-169fb1bb2c58d0%22%2C%22%24device_id%22%3A%22169fb1bb2c41ea-04951e55adc96a-7a1437-2073600-169fb1bb2c58d0%22%7D; sajssdk_2015_cross_new_user=1; _putrc=4C5D2603888320CA; JSESSIONID=ABAAABAAADEAAFIB00F5DDE71D51610901CB9E0031812BA; login=true; unick=%E4%BC%8D%E6%99%93%E4%B8%BD; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=49; gate_login_token=7b04a40da89145a1fbc90a3d719616d28c8b0a303344ac37; index_location_city=%E6%88%90%E9%83%BD; X_MIDDLE_TOKEN=1221e6b5040722dc86f5ceb557e11965; _gat=1; LGSID=20190408151935-a9976fbf-59ce-11e9-8cc8-5254005c3644; PRE_UTM=m_cf_cpc_baidu_pc; PRE_HOST=www.baidu.com; PRE_SITE=https%3A%2F%2Fwww.baidu.com%2Fbaidu.php%3Fsc.Ks000001qLT2daZnZWIez3ktR_jhHue3tONZubxU9mivhxeuj-Fxrjg6NnVcKTp-GYJ_YRvrc9_yOJ4uV-IEpfnPazPz7ctjve1qlDokCDfHYo9PV0uDfTmN1OunNUcCRU-sJuR8RZz60PAXzfKybAdvuCxUedbt8aWtTjAdCCuO298TwT8zN1-T5EG3kgkOweg0DHGIbvP55IZbr6.DY_NR2Ar5Od663rj6tJQrGvKD7ZZKNfYYmcgpIQC8xxKfYt_U_DY2yP5Qjo4mTT5QX1BsT8rZoG4XL6mEukmryZZjzsLTJplePXO-8zNqrw5Q9tSMj_qTr1x9tqvZul3xg1sSxW9qx-9LdoDkY4QPSl81_4pqO24rM-8dQjPakb3dS5iC0.U1Yk0ZDqs2v4VnL30ZKGm1Yk0Zfqs2v4VnL30A-V5HcsP0KM5gK1n6KdpHdBmy-bIykV0ZKGujYzr0KWpyfqnWcv0AdY5HDsnHIxnH0krNtknjc1g1nsnHNxn1msnfKopHYs0ZFY5HDLn6K-pyfq0AFG5HcsP0KVm1Y3nHDYP1fsrjuxnH0snNtkg1Dsn-ts0Z7spyfqn0Kkmv-b5H00ThIYmyTqn0K9mWYsg100ugFM5H00TZ0qPWm1PHm1rj640A4vTjYsQW0snj0snj0s0AdYTjYs0AwbUL0qn0KzpWYs0Aw-IWdsmsKhIjYs0ZKC5H00ULnqn0KBI1Ykn0K8IjYs0ZPl5fK9TdqGuAnqTZnVUhC0IZN15Hnkn1fknHT4P1DvPHR1PW61P100ThNkIjYkPHRYP10LrHTkPjTY0ZPGujd9rAwBmhuWrj0snjDzrj0Y0AP1UHYsPbm3wWTsrH0srjwarDcz0A7W5HD0TA3qn0KkUgfqn0KkUgnqn0KlIjYs0AdWgvuzUvYqn7tsg1Kxn7ts0Aw9UMNBuNqsUA78pyw15HKxn7tsg1nkrjm4nNts0ZK9I7qhUA7M5H00uAPGujYknjT1P1fkrjcY0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KkUymqn0KhmLNY5H00uMGC5H00uh7Y5H00XMK_Ignqn0K9uAu_myTqnfK_uhnqn0KEIjYs0AqzTZfqnanscznsc100mLFW5HRdPj0Y%26word%3D%25E6%258B%2589%25E5%258B%25BE%25E7%25BD%2591%26ck%3D1701.10.72.227.558.354.602.254%26shh%3Dwww.baidu.com%26sht%3D62095104_19_oem_dg%26us%3D1.0.1.0.1.301.0%26bc%3D110101; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2Flp%2Fhtml%2Fcommon.html%3Futm_source%3Dm_cf_cpc_baidu_pc%26m_kw%3Dbaidu_cpc_cd_e110f9_d2162e_%25E6%258B%2589%25E5%258B%25BE%25E7%25BD%2591; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1553064535,1554696044,1554707975; TG-TRACK-CODE=index_search; SEARCH_ID=16b25888bc6f489f981996ef505d6930; X_HTTP_TOKEN=3704e5535eab672a10080745514b2c7fac0430c282; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1554708001; LGRID=20190408152002-b9743b5b-59ce-11e9-9a84-525400f775ce", "X-Anit-Forge-Code":"0" , "X-Anit-Forge-Token":'', "X-Requested-With":'XMLHttpRequest'}<br />def get_detail_page_url(): datas =[] url = 'https://www.lagou.com/jobs/positionAjax.json' form_data = { "first":"faise", "pn":1, "kd":"python" } params = { 'city':'成都', 'needAddtionalResult':'false' } for pn in range(1,14): form_data['pn'] = pn response = requests.request(method='post',url=url,headers=headers,params = params,data = form_data) result = response.json() result_list = result['content']['positionResult']['result'] for position in result_list: position_id = position['positionId'] detail_url = 'https://www.lagou.com/jobs/%s.html'%position_id data = parse_detail_page(detail_url) datas.append(data) time.sleep(2) return datas<br />def parse_detail_page(url): resonse = requests.request(method='get',url=url,headers = headers) text = resonse.text html = etree.fromstring(text,parser=etree.HTMLParser()) position_name = html.xpath('//span[@class="name"]/text()')[0].strip() detail_list = html.xpath('//dd[@class="job_request"]//span') salary = detail_list[0].xpath('text()')[0].strip() city = detail_list[1].xpath('text()')[0].strip() city = re.sub(r'[\s/]','',city) work_years = detail_list[2].xpath('text()')[0].strip() work_years = re.sub(r'[\s/]','',work_years) education = detail_list[3].xpath('text()')[0].strip() education = re.sub(r'[\s/]','',education) job_details = ''.join(html.xpath('//div[@class="job-detail"]//p//text()')) data = { "position_name":position_name, "salay":salary, "city":city, "work_years":work_years, "education":education, "job_details":job_details<br /> } return data<br /><br /><br />def main(): datas = get_detail_page_url() print(datas)<br />if __name__ == '__main__':    main()
  selenium结合lxml爬取
  from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import By<br />from lxml import etreeimport reimport time<br />class Lagouspider(object): driver_path = r'E:\study\chromedriver\chromedriver.exe' def __init__(self): self.driver = webdriver.Chrome(executable_path=Lagouspider.driver_path) self.url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=' self.positions = []<br /> def run(self): while True: self.driver.get(self.url) source = self.driver.page_source WebDriverWait(driver=self.driver,timeout=10).until(EC.presence_of_element_located((By.XPATH,'//div[@class="pager_container"]/span[last()]'))) self.parse_list_page(source) next_btn = self.driver.find_element_by_xpath('//div[@class="pager_container"]/span[last()]') if "pager_next_disabled" in next_btn.get_attribute('class'): break else: next_btn.click() time.sleep(1)<br /> def parse_list_page(self,source): html = etree.HTML(source) links = html.xpath('//a[@class="position_link"]/@href') for link in links: self.request_detail_page(link) time.sleep(1)<br /> def request_detail_page(self,url): self.driver.execute_script("window.open('%s')"%url) self.driver.switch_to.window(self.driver.window_handles[1]) WebDriverWait(self.driver,timeout=10).until(EC.presence_of_element_located((By.XPATH,'//span[@class="name"]'))) source = self.driver.page_source self.parse_detail_page(source) #关闭当前详情页 self.driver.close() #切换回职位列表页 self.driver.switch_to.window(self.driver.window_handles[0])<br /> def parse_detail_page(self,source): html = etree.HTML(source) position_name = html.xpath('//span[@class="name"]/text()')[0].strip() detail_list = html.xpath('//dd[@class="job_request"]//span') salary = detail_list[0].xpath('text()')[0].strip() city = detail_list[1].xpath('text()')[0].strip() city = re.sub(r'[\s/]', '', city) work_years = detail_list[2].xpath('text()')[0].strip() work_years = re.sub(r'[\s/]', '', work_years) education = detail_list[3].xpath('text()')[0].strip() education = re.sub(r'[\s/]', '', education) desc = ''.join(html.xpath('//dd[@class="job_bt"]//text()')).strip() data = { "name": position_name, "salay": salary, "city": city, "work_years": work_years, "education": education, "desc": desc } print(data) print('+'*40) self.positions.append(data)<br />if __name__ == '__main__': spider = Lagouspider()    spider.run()
  原文链接:
  

  鼓励一下
  
  赞完再走 查看全部

  Selenium抓取动态网页数据

  1.selenium抓取动态网页数据基础介绍1.1 什么是AJAXAJAX(Asynchronouse JavaScript And XML:异步JavaScript和XML)通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行局部更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。因为传统的网页在传输数据格式方面,使用的是XML语法,因此叫做AJAX,其实现在数据交互基本上都是使用JSON。使用AJAX加载的数据,即使使用了JS将数据渲染到了浏览器中,在右键->查看网页源代码还是不能看到通过ajax加载的数据,只能看到使用这个url加载的html代码。1.2 获取ajax数据的方式法1:直接分析ajax调用的接口。然后通过代码请求这个接口。法2:使用Selenium+chromedriver模拟浏览器行为获取数据。
  方式
  优点
  缺点
  分析接口
  直接可以请求到数据。不需要做一些解析工作。代码量少,性能高。
  分析接口比较复杂,特别是一些通过js混淆的接口,要有一定的js功底。容易被发现是爬虫。
  selenium
  直接模拟浏览器的行为。浏览器能请求到的,使用selenium也能请求到。爬虫更稳定。
  代码量多。性能低。
  1.3 Selenium+chromedriver获取动态数据Selenium相当于是一个机器人。可以模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等。chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:Chrome:Firefox:Edge:Safari:1.4 安装Selenium和chromedriver安装Selenium:Selenium有很多语言的版本,有java、ruby、python等。我们下载python版本的就可以了。
   pip install selenium
  安装chromedriver:下载完成后,放到不需要权限的纯英文目录下就可以了。1.5 快速入门现在以一个简单的获取百度首页的例子来讲下Selenium和chromedriver如何快速入门:
  from selenium import webdriver<br /># chromedriver的绝对路径driver_path = r'D:\ProgramApp\chromedriver\chromedriver.exe'<br /># 初始化一个driver,并且指定chromedriver的路径driver = webdriver.Chrome(executable_path=driver_path)# 请求网页driver.get("https://www.baidu.com/";)# 通过page_source获取网页源代码print(driver.page_source)
  1.6 selenium常用操作
  1.7 爬取拉钩网职位信息
  直接直接分析ajax调用的接口爬取
  import requestsfrom lxml import etreeimport timeimport re<br /><br />headers = { "Accept":"application/json, text/javascript, */*; q=0.01", "Accept-Encoding":"gzip, deflate, br", "Accept-Language":"zh-CN,zh;q=0.9", "Connection":"keep-alive", "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", "Referer":"https://www.lagou.com/jobs/lis ... ot%3B, "Origin":"https://www.lagou.com", "Host":"www.lagou.com", "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8", "Cookie":"_ga=GA1.2.1602115737.1553064534; user_trace_token=20190320144853-39b1375a-4adc-11e9-a253-525400f775ce; LGUID=20190320144853-39b13f88-4adc-11e9-a253-525400f775ce; WEBTJ-ID=20190408120043-169fb1afd63488-06179b118ca307-7a1437-2073600-169fb1afd648ed; _gid=GA1.2.1826141825.1554696044; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22169fb1bb2c41ea-04951e55adc96a-7a1437-2073600-169fb1bb2c58d0%22%2C%22%24device_id%22%3A%22169fb1bb2c41ea-04951e55adc96a-7a1437-2073600-169fb1bb2c58d0%22%7D; sajssdk_2015_cross_new_user=1; _putrc=4C5D2603888320CA; JSESSIONID=ABAAABAAADEAAFIB00F5DDE71D51610901CB9E0031812BA; login=true; unick=%E4%BC%8D%E6%99%93%E4%B8%BD; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=49; gate_login_token=7b04a40da89145a1fbc90a3d719616d28c8b0a303344ac37; index_location_city=%E6%88%90%E9%83%BD; X_MIDDLE_TOKEN=1221e6b5040722dc86f5ceb557e11965; _gat=1; LGSID=20190408151935-a9976fbf-59ce-11e9-8cc8-5254005c3644; PRE_UTM=m_cf_cpc_baidu_pc; PRE_HOST=www.baidu.com; PRE_SITE=https%3A%2F%2Fwww.baidu.com%2Fbaidu.php%3Fsc.Ks000001qLT2daZnZWIez3ktR_jhHue3tONZubxU9mivhxeuj-Fxrjg6NnVcKTp-GYJ_YRvrc9_yOJ4uV-IEpfnPazPz7ctjve1qlDokCDfHYo9PV0uDfTmN1OunNUcCRU-sJuR8RZz60PAXzfKybAdvuCxUedbt8aWtTjAdCCuO298TwT8zN1-T5EG3kgkOweg0DHGIbvP55IZbr6.DY_NR2Ar5Od663rj6tJQrGvKD7ZZKNfYYmcgpIQC8xxKfYt_U_DY2yP5Qjo4mTT5QX1BsT8rZoG4XL6mEukmryZZjzsLTJplePXO-8zNqrw5Q9tSMj_qTr1x9tqvZul3xg1sSxW9qx-9LdoDkY4QPSl81_4pqO24rM-8dQjPakb3dS5iC0.U1Yk0ZDqs2v4VnL30ZKGm1Yk0Zfqs2v4VnL30A-V5HcsP0KM5gK1n6KdpHdBmy-bIykV0ZKGujYzr0KWpyfqnWcv0AdY5HDsnHIxnH0krNtknjc1g1nsnHNxn1msnfKopHYs0ZFY5HDLn6K-pyfq0AFG5HcsP0KVm1Y3nHDYP1fsrjuxnH0snNtkg1Dsn-ts0Z7spyfqn0Kkmv-b5H00ThIYmyTqn0K9mWYsg100ugFM5H00TZ0qPWm1PHm1rj640A4vTjYsQW0snj0snj0s0AdYTjYs0AwbUL0qn0KzpWYs0Aw-IWdsmsKhIjYs0ZKC5H00ULnqn0KBI1Ykn0K8IjYs0ZPl5fK9TdqGuAnqTZnVUhC0IZN15Hnkn1fknHT4P1DvPHR1PW61P100ThNkIjYkPHRYP10LrHTkPjTY0ZPGujd9rAwBmhuWrj0snjDzrj0Y0AP1UHYsPbm3wWTsrH0srjwarDcz0A7W5HD0TA3qn0KkUgfqn0KkUgnqn0KlIjYs0AdWgvuzUvYqn7tsg1Kxn7ts0Aw9UMNBuNqsUA78pyw15HKxn7tsg1nkrjm4nNts0ZK9I7qhUA7M5H00uAPGujYknjT1P1fkrjcY0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KkUymqn0KhmLNY5H00uMGC5H00uh7Y5H00XMK_Ignqn0K9uAu_myTqnfK_uhnqn0KEIjYs0AqzTZfqnanscznsc100mLFW5HRdPj0Y%26word%3D%25E6%258B%2589%25E5%258B%25BE%25E7%25BD%2591%26ck%3D1701.10.72.227.558.354.602.254%26shh%3Dwww.baidu.com%26sht%3D62095104_19_oem_dg%26us%3D1.0.1.0.1.301.0%26bc%3D110101; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2Flp%2Fhtml%2Fcommon.html%3Futm_source%3Dm_cf_cpc_baidu_pc%26m_kw%3Dbaidu_cpc_cd_e110f9_d2162e_%25E6%258B%2589%25E5%258B%25BE%25E7%25BD%2591; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1553064535,1554696044,1554707975; TG-TRACK-CODE=index_search; SEARCH_ID=16b25888bc6f489f981996ef505d6930; X_HTTP_TOKEN=3704e5535eab672a10080745514b2c7fac0430c282; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1554708001; LGRID=20190408152002-b9743b5b-59ce-11e9-9a84-525400f775ce", "X-Anit-Forge-Code":"0" , "X-Anit-Forge-Token":'', "X-Requested-With":'XMLHttpRequest'}<br />def get_detail_page_url(): datas =[] url = 'https://www.lagou.com/jobs/positionAjax.json' form_data = { "first":"faise", "pn":1, "kd":"python" } params = { 'city':'成都', 'needAddtionalResult':'false' } for pn in range(1,14): form_data['pn'] = pn response = requests.request(method='post',url=url,headers=headers,params = params,data = form_data) result = response.json() result_list = result['content']['positionResult']['result'] for position in result_list: position_id = position['positionId'] detail_url = 'https://www.lagou.com/jobs/%s.html'%position_id data = parse_detail_page(detail_url) datas.append(data) time.sleep(2) return datas<br />def parse_detail_page(url): resonse = requests.request(method='get',url=url,headers = headers) text = resonse.text html = etree.fromstring(text,parser=etree.HTMLParser()) position_name = html.xpath('//span[@class="name"]/text()')[0].strip() detail_list = html.xpath('//dd[@class="job_request"]//span') salary = detail_list[0].xpath('text()')[0].strip() city = detail_list[1].xpath('text()')[0].strip() city = re.sub(r'[\s/]','',city) work_years = detail_list[2].xpath('text()')[0].strip() work_years = re.sub(r'[\s/]','',work_years) education = detail_list[3].xpath('text()')[0].strip() education = re.sub(r'[\s/]','',education) job_details = ''.join(html.xpath('//div[@class="job-detail"]//p//text()')) data = { "position_name":position_name, "salay":salary, "city":city, "work_years":work_years, "education":education, "job_details":job_details<br /> } return data<br /><br /><br />def main(): datas = get_detail_page_url() print(datas)<br />if __name__ == '__main__':    main()
  selenium结合lxml爬取
  from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import By<br />from lxml import etreeimport reimport time<br />class Lagouspider(object): driver_path = r'E:\study\chromedriver\chromedriver.exe' def __init__(self): self.driver = webdriver.Chrome(executable_path=Lagouspider.driver_path) self.url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=' self.positions = []<br /> def run(self): while True: self.driver.get(self.url) source = self.driver.page_source WebDriverWait(driver=self.driver,timeout=10).until(EC.presence_of_element_located((By.XPATH,'//div[@class="pager_container"]/span[last()]'))) self.parse_list_page(source) next_btn = self.driver.find_element_by_xpath('//div[@class="pager_container"]/span[last()]') if "pager_next_disabled" in next_btn.get_attribute('class'): break else: next_btn.click() time.sleep(1)<br /> def parse_list_page(self,source): html = etree.HTML(source) links = html.xpath('//a[@class="position_link"]/@href') for link in links: self.request_detail_page(link) time.sleep(1)<br /> def request_detail_page(self,url): self.driver.execute_script("window.open('%s')"%url) self.driver.switch_to.window(self.driver.window_handles[1]) WebDriverWait(self.driver,timeout=10).until(EC.presence_of_element_located((By.XPATH,'//span[@class="name"]'))) source = self.driver.page_source self.parse_detail_page(source) #关闭当前详情页 self.driver.close() #切换回职位列表页 self.driver.switch_to.window(self.driver.window_handles[0])<br /> def parse_detail_page(self,source): html = etree.HTML(source) position_name = html.xpath('//span[@class="name"]/text()')[0].strip() detail_list = html.xpath('//dd[@class="job_request"]//span') salary = detail_list[0].xpath('text()')[0].strip() city = detail_list[1].xpath('text()')[0].strip() city = re.sub(r'[\s/]', '', city) work_years = detail_list[2].xpath('text()')[0].strip() work_years = re.sub(r'[\s/]', '', work_years) education = detail_list[3].xpath('text()')[0].strip() education = re.sub(r'[\s/]', '', education) desc = ''.join(html.xpath('//dd[@class="job_bt"]//text()')).strip() data = { "name": position_name, "salay": salary, "city": city, "work_years": work_years, "education": education, "desc": desc } print(data) print('+'*40) self.positions.append(data)<br />if __name__ == '__main__': spider = Lagouspider()    spider.run()
  原文链接:
  

  鼓励一下
  
  赞完再走

完整解决方案:H5与Native交互之JSBridge技术

网站优化优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2022-09-24 17:10 • 来自相关话题

  完整解决方案:H5与Native交互之JSBridge技术
  许多做过混合开发的人都知道 Ionic 和 PhoneGap 等框架。这些框架在web的基础上包裹了一层Native,然后利用Bridge技术让js调用视频、位置、音频等功能。本文就是介绍Bridge这一层的交互原理。通过阅读本文,可以了解js、ios和android的底层通信原理,以及JSBridge的封装技术和调试方法。
  一、原则
  下面介绍IOS与Android和Javascript的底层交互原理
  IOS
  在解释原理之前,我们先来了解一下iOS的UIWebView组件。我们来看看苹果官方的介绍:
  您可以使用 UIWebView 类在您的应用程序中嵌入 Web 内容。为此,您只需创建一个 UIWebView 对象,将其附加到窗口,并向其发送加载 Web 内容的请求。您还可以使用该类在网页历史记录中前后移动,甚至可以通过编程方式设置一些网页内容属性。
  上面的意思是UIWebView是一个可以加载网页的对象,它具有浏览记录功能,加载的网页内容是可编程的。说白了,UIWebView 有一个类似浏览器的功能。我们可以用它来打开页面,做一些自定义的功能,比如让js调用某个方法来获取手机的GPS信息。
  但需要注意的是,Safari浏览器使用的浏览器控件和UIwebView组件并不相同,两者在性能上存在较大差距。幸运的是,苹果在发布 iOS8 时,添加了一个 WKWebView 组件。如果你的APP只考虑支持iOS8及以上,那么你可以使用这个新的浏览器控件。
  原生 UIWebView 类提供以下属性和方法
  属性:
  方法:
  Native(Objective-C 或 Swift)调用 Javascript 方法
  Native通过UIWebView组件的stringByEvaluatingJavaScriptFromString方法调用Javascript语言,返回js脚本的执行结果。
  // Swift
webview.stringByEvaluatingJavaScriptFromString("Math.random()")
// OC
[webView stringByEvaluatingJavaScriptFromString:@"Math.random();"];
  从上面的代码可以看出,它实际上是调用了窗口下的一个对象。如果我们想让native调用我们js写的方法,那么这个方法必须是window下可以访问的。但是从全局来看,我们只需要暴露一个JSBridge这样的对象就可以调用native,所以这里我们可以对native代码做一个简单的封装:
  //下面为伪代码
webview.setDataToJs(somedata);
webview.setDataToJs = function(data) {
webview.stringByEvaluatingJavaScriptFromString("JSBridge.trigger(event, data)")
}
  Javascript 调用本机(Objective-C 或 Swift)方法
  反过来,Javascript调用Native,没有现成的API可以直接使用,需要通过一些方法间接实现。 UIWebView有一个特点:所有在UIWebView发起的网络请求都可以通过delegate函数在Native层得到通知。这样,我们就可以在UIWebView中发起一个自定义的网络请求,通常是这样的格式:jsbridge://methodName?param1=value1&param2=value2
  所以在UIWebView的delegate函数中,只要找到以jsbridge://开头的地址,就不会加载内容,而是执行相应的调用逻辑。
  有两种方式发起这样的网络请求:1.通过localtion.href; 2. 通过 iframe;
  location.href有一个问题,就是如果我们连续多次修改window.location.href的值,Native层只能接收到最后一个请求,而之前的请求会被忽略。
  使用iframe方法,以唤起Native APP的分享组件为例,简单的闭包如下:
  var url = 'jsbridge://doAction?title=分享标题&desc=分享描述&link=http%3A%2F%2Fwww.baidu.com';
var iframe = document.createElement('iframe');
iframe.style.width = '1px';
iframe.style.height = '1px';
iframe.style.display = 'none';
iframe.src = url;
document.body.appendChild(iframe);
setTimeout(function() {
iframe.remove();
}, 100);
  然后Webview可以拦截请求,解析出对应的方法和参数。如以下代码所示:
  func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
print("shouldStartLoadWithRequest")
let url = request.URL
let scheme = url?.scheme
let method = url?.host
let query = url?.query

if url != nil && scheme == "jsbridge" {
print("scheme == \(scheme)")
print("method == \(method)")
print("query == \(query)")
switch method! {
case "getData":
self.getData()
case "putData":
self.putData()
case "gotoWebview":
self.gotoWebview()
case "gotoNative":
self.gotoNative()
case "doAction":
self.doAction()
case "configNative":
self.configNative()
default:
print("default")
}

return false
} else {
return true
}
}
  安卓
  在android中,native和js的通信方式与ios类似,android中也支持ios中的schema方式。
  javascript 调用原生方法
  目前android中调用native的方式有3种:
  1.使用shouldOverrideUrlLoading方法通过schema方法解析url协议。这个js的调用方式和ios一样,都是用iframe调用原生代码。
  2.通过将原生js代码直接注入webview页面,使用addJavascriptInterface方法实现。
  
  在android中的实现如下:
  class JSInterface {
@JavascriptInterface //注意这个代码一定要加上
public String getUserData() {
return "UserData";
}
}
webView.addJavascriptInterface(new JSInterface(), "AndroidJS");
  以上代码将AndroidJS对象注入到页面的window对象中。可以直接在js中调用
  alert(AndroidJS.getUserData()) //UserDate
  3.使用 prompt、console.log 和 alert 方法。这三个方法是js原生的,可以在android webview层重写。一般我们用prompt,因为这个在js里用的不多,和native交流的副作用也少。
  class YouzanWebChromeClient extends WebChromeClient {
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
// 这里就可以对js的prompt进行处理,通过result返回结果
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
}
}
  Native 调用 javascript 方法
  在android中,使用webview的loadUrl调用,如:
  // 调用js中的JSBridge.trigger方法
webView.loadUrl("javascript:JSBridge.trigger('webviewReady')");
  二、库的封装js调用原生封装
  上面我们了解了js和native通信的底层原理,所以我们可以封装一个基本的通信方法doCall来屏蔽android和ios的区别。
  YouzanJsBridge = {
doCall: function(functionName, data, callback) {
var _this = this;
// 解决连续调用问题
if (this.lastCallTime && (Date.now() - this.lastCallTime) < 100) {
setTimeout(function() {
_this.doCall(functionName, data, callback);
}, 100);
return;
}
this.lastCallTime = Date.now();

data = data || {};
if (callback) {
$.extend(data, { callback: callback });
}

if (UA.isIOS()) {
$.each(data, function(key, value) {
if ($.isPlainObject(value) || $.isArray(value)) {
data[key] = JSON.stringify(value);
}
});
var url = Args.addParameter('youzanjs://' + functionName, data);
var iframe = document.createElement('iframe');
iframe.style.width = '1px';
iframe.style.height = '1px';
iframe.style.display = 'none';
iframe.src = url;
document.body.appendChild(iframe);
setTimeout(function() {
iframe.remove();
}, 100);
} else if (UA.isAndroid()) {
window.androidJS && window.androidJS[functionName] && window.androidJS[functionName](JSON.stringify(data));
} else {
console.error('未获取platform信息,调取api失败');
}
}
}
  在android端,我们使用addJavascriptInterface方法注入了一个AndroidJS对象。
  项目常用方法抽象
  在项目的实践中,我们逐渐抽象出一些通用的方法,基本可以满足项目的需要。如下:
  1.getData(datatype, callback, extra) H5从Native APP获取数据
  使用场景:当H5需要从Native APP获取一些数据时,可以调用该方法。
  参数类型是否必填示例值说明
  数据类型
  字符串
  是的
  
  用户信息
  数据类型
  回调
  功能
  是的
  回调函数
  额外的
  对象
  没有
  传递给 Native APP 的数据对象
  示例代码:
  JSBridge.getData('userInfo',function(data) {
console.log(data);
});
  2.putData(datatype, data) H5告诉Native APP一些数据
  使用场景:H5告诉Native APP一些数据,可以调用这个方法。
  参数类型是否必填示例值说明
  数据类型
  字符串
  是的
  用户信息
  数据类型
  数据
  对象
  是的
  { 用户名:'zhangsan',年龄:20 }
  传递给 Native APP 的数据对象
  示例代码:
  JSBridge.putData('userInfo', {
username: 'zhangsan',
age: 20
});
  3.gotoWebview(url, page, data) 原生APP打开一个新的Webview窗口并打开对应的网页参数类型必填示例值说明
  网址
  字符串
  是的
  网页链接地址,一般只要传URL参数就可以了
  页面
  字符串
  没有
  网络
  网页类型,默认为web
  数据
  对象
  没有
  额外的参数对象
  示例代码:
  // 示例1:打开一个网页
JSBridge.gotoWebview('http://www.youzan.com');
// 示例2:打开一个网页,并且传递额外的参数给Native APP
JSBridge.gotoWebview('http://www.youzan.com', 'goodsDetail', {
goods_id: 10000,
title: '这是商品的标题',
desc: '这是商品的描述'
});
  4.gotoNative(page, data) 从H5页面跳转到Native APP类型的native接口参数必填示例值说明
  页面
  字符串
  是的
  登录页面
  本机页面标识符,例如 loginPage
  数据
  对象
  没有
  { 用户名:'zhangsan',年龄:20 }
  额外的参数对象
  示例代码:
  // 示例1:打开Native APP登录页面
JSBridge.gotoNative('loginPage');
// 示例2:打开Native APP登录页面,并且传递用户名给Native APP
JSBridge.gotoNative('loginPage', {
username: '张三'
});
  5.doAction(action, data) 函数上的一些动作参数 Type 是否必填 示例值 说明
  动作
  字符串
  是的
  复制
  核心方法:PHP如何使用curl实现数据抓取
  PHP如何使用curl实现数据抓取介绍如何使用curl实现数据抓取?以下是为您提供的实现代码。您可以参考代码以获取更多详细信息。代理服务器代理服务器地址httpwwwcnproxycomproxy1htmlHongKongChina的速度比较好 curl_setoptchCURLOPT_PROXYcu
  
  rl_setoptchCURLOPT_URLurlcurl_setoptchCURLOPT_RETURNTRANSFER1returndontprintcurl_setoptchCURLOPT_TIMEOUT30设置超时时间curl_setoptchCURLOPT_USERAGENTMozilla40compatibleMSIE501WindowsNT50curl_setoptchCURLOPT_FOLLOWLOCATION1302redirectcurl_setoptchCURLOPT_MAXREDIRS7HTTp定向级别curl_multi_add_handlemhch把curlresource放进multicurlhandler里handle[i]ch执行domrccurl_multi_execmhrunningifwait_usec0每个connect要间隔多久usleepwa
  
  it_usec250000025secwhilemrcCURLM_CALL_MULTI_PERFORMwhilerunningmrcCURLM_OKifcurl_multi_selectmh-1domrccurl_multi_execmhrunningwhilemrcCURLM_CALL_MULTI_PERFORM读取资料foreachhandleasichcontentcurl_multi_getcontentchdata[i]curl_errnoch0contentfalse移除handleforeachhandleaschcurl_multi_remove_handlemhchcurl_multi_closemhreturndataurlsarrayhttpmapbaiducomreasync_get_urlurlsechore[0] 查看全部

  完整解决方案:H5与Native交互之JSBridge技术
  许多做过混合开发的人都知道 Ionic 和 PhoneGap 等框架。这些框架在web的基础上包裹了一层Native,然后利用Bridge技术让js调用视频、位置、音频等功能。本文就是介绍Bridge这一层的交互原理。通过阅读本文,可以了解js、ios和android的底层通信原理,以及JSBridge的封装技术和调试方法。
  一、原则
  下面介绍IOS与Android和Javascript的底层交互原理
  IOS
  在解释原理之前,我们先来了解一下iOS的UIWebView组件。我们来看看苹果官方的介绍:
  您可以使用 UIWebView 类在您的应用程序中嵌入 Web 内容。为此,您只需创建一个 UIWebView 对象,将其附加到窗口,并向其发送加载 Web 内容的请求。您还可以使用该类在网页历史记录中前后移动,甚至可以通过编程方式设置一些网页内容属性。
  上面的意思是UIWebView是一个可以加载网页的对象,它具有浏览记录功能,加载的网页内容是可编程的。说白了,UIWebView 有一个类似浏览器的功能。我们可以用它来打开页面,做一些自定义的功能,比如让js调用某个方法来获取手机的GPS信息。
  但需要注意的是,Safari浏览器使用的浏览器控件和UIwebView组件并不相同,两者在性能上存在较大差距。幸运的是,苹果在发布 iOS8 时,添加了一个 WKWebView 组件。如果你的APP只考虑支持iOS8及以上,那么你可以使用这个新的浏览器控件。
  原生 UIWebView 类提供以下属性和方法
  属性:
  方法:
  Native(Objective-C 或 Swift)调用 Javascript 方法
  Native通过UIWebView组件的stringByEvaluatingJavaScriptFromString方法调用Javascript语言,返回js脚本的执行结果。
  // Swift
webview.stringByEvaluatingJavaScriptFromString("Math.random()")
// OC
[webView stringByEvaluatingJavaScriptFromString:@"Math.random();"];
  从上面的代码可以看出,它实际上是调用了窗口下的一个对象。如果我们想让native调用我们js写的方法,那么这个方法必须是window下可以访问的。但是从全局来看,我们只需要暴露一个JSBridge这样的对象就可以调用native,所以这里我们可以对native代码做一个简单的封装:
  //下面为伪代码
webview.setDataToJs(somedata);
webview.setDataToJs = function(data) {
webview.stringByEvaluatingJavaScriptFromString("JSBridge.trigger(event, data)")
}
  Javascript 调用本机(Objective-C 或 Swift)方法
  反过来,Javascript调用Native,没有现成的API可以直接使用,需要通过一些方法间接实现。 UIWebView有一个特点:所有在UIWebView发起的网络请求都可以通过delegate函数在Native层得到通知。这样,我们就可以在UIWebView中发起一个自定义的网络请求,通常是这样的格式:jsbridge://methodName?param1=value1&param2=value2
  所以在UIWebView的delegate函数中,只要找到以jsbridge://开头的地址,就不会加载内容,而是执行相应的调用逻辑。
  有两种方式发起这样的网络请求:1.通过localtion.href; 2. 通过 iframe;
  location.href有一个问题,就是如果我们连续多次修改window.location.href的值,Native层只能接收到最后一个请求,而之前的请求会被忽略。
  使用iframe方法,以唤起Native APP的分享组件为例,简单的闭包如下:
  var url = 'jsbridge://doAction?title=分享标题&desc=分享描述&link=http%3A%2F%2Fwww.baidu.com';
var iframe = document.createElement('iframe');
iframe.style.width = '1px';
iframe.style.height = '1px';
iframe.style.display = 'none';
iframe.src = url;
document.body.appendChild(iframe);
setTimeout(function() {
iframe.remove();
}, 100);
  然后Webview可以拦截请求,解析出对应的方法和参数。如以下代码所示:
  func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
print("shouldStartLoadWithRequest")
let url = request.URL
let scheme = url?.scheme
let method = url?.host
let query = url?.query

if url != nil && scheme == "jsbridge" {
print("scheme == \(scheme)")
print("method == \(method)")
print("query == \(query)")
switch method! {
case "getData":
self.getData()
case "putData":
self.putData()
case "gotoWebview":
self.gotoWebview()
case "gotoNative":
self.gotoNative()
case "doAction":
self.doAction()
case "configNative":
self.configNative()
default:
print("default")
}

return false
} else {
return true
}
}
  安卓
  在android中,native和js的通信方式与ios类似,android中也支持ios中的schema方式。
  javascript 调用原生方法
  目前android中调用native的方式有3种:
  1.使用shouldOverrideUrlLoading方法通过schema方法解析url协议。这个js的调用方式和ios一样,都是用iframe调用原生代码。
  2.通过将原生js代码直接注入webview页面,使用addJavascriptInterface方法实现。
  
  在android中的实现如下:
  class JSInterface {
@JavascriptInterface //注意这个代码一定要加上
public String getUserData() {
return "UserData";
}
}
webView.addJavascriptInterface(new JSInterface(), "AndroidJS");
  以上代码将AndroidJS对象注入到页面的window对象中。可以直接在js中调用
  alert(AndroidJS.getUserData()) //UserDate
  3.使用 prompt、console.log 和 alert 方法。这三个方法是js原生的,可以在android webview层重写。一般我们用prompt,因为这个在js里用的不多,和native交流的副作用也少。
  class YouzanWebChromeClient extends WebChromeClient {
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
// 这里就可以对js的prompt进行处理,通过result返回结果
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
}
}
  Native 调用 javascript 方法
  在android中,使用webview的loadUrl调用,如:
  // 调用js中的JSBridge.trigger方法
webView.loadUrl("javascript:JSBridge.trigger('webviewReady')");
  二、库的封装js调用原生封装
  上面我们了解了js和native通信的底层原理,所以我们可以封装一个基本的通信方法doCall来屏蔽android和ios的区别。
  YouzanJsBridge = {
doCall: function(functionName, data, callback) {
var _this = this;
// 解决连续调用问题
if (this.lastCallTime && (Date.now() - this.lastCallTime) < 100) {
setTimeout(function() {
_this.doCall(functionName, data, callback);
}, 100);
return;
}
this.lastCallTime = Date.now();

data = data || {};
if (callback) {
$.extend(data, { callback: callback });
}

if (UA.isIOS()) {
$.each(data, function(key, value) {
if ($.isPlainObject(value) || $.isArray(value)) {
data[key] = JSON.stringify(value);
}
});
var url = Args.addParameter('youzanjs://' + functionName, data);
var iframe = document.createElement('iframe');
iframe.style.width = '1px';
iframe.style.height = '1px';
iframe.style.display = 'none';
iframe.src = url;
document.body.appendChild(iframe);
setTimeout(function() {
iframe.remove();
}, 100);
} else if (UA.isAndroid()) {
window.androidJS && window.androidJS[functionName] && window.androidJS[functionName](JSON.stringify(data));
} else {
console.error('未获取platform信息,调取api失败');
}
}
}
  在android端,我们使用addJavascriptInterface方法注入了一个AndroidJS对象。
  项目常用方法抽象
  在项目的实践中,我们逐渐抽象出一些通用的方法,基本可以满足项目的需要。如下:
  1.getData(datatype, callback, extra) H5从Native APP获取数据
  使用场景:当H5需要从Native APP获取一些数据时,可以调用该方法。
  参数类型是否必填示例值说明
  数据类型
  字符串
  是的
  
  用户信息
  数据类型
  回调
  功能
  是的
  回调函数
  额外的
  对象
  没有
  传递给 Native APP 的数据对象
  示例代码:
  JSBridge.getData('userInfo',function(data) {
console.log(data);
});
  2.putData(datatype, data) H5告诉Native APP一些数据
  使用场景:H5告诉Native APP一些数据,可以调用这个方法。
  参数类型是否必填示例值说明
  数据类型
  字符串
  是的
  用户信息
  数据类型
  数据
  对象
  是的
  { 用户名:'zhangsan',年龄:20 }
  传递给 Native APP 的数据对象
  示例代码:
  JSBridge.putData('userInfo', {
username: 'zhangsan',
age: 20
});
  3.gotoWebview(url, page, data) 原生APP打开一个新的Webview窗口并打开对应的网页参数类型必填示例值说明
  网址
  字符串
  是的
  网页链接地址,一般只要传URL参数就可以了
  页面
  字符串
  没有
  网络
  网页类型,默认为web
  数据
  对象
  没有
  额外的参数对象
  示例代码:
  // 示例1:打开一个网页
JSBridge.gotoWebview('http://www.youzan.com');
// 示例2:打开一个网页,并且传递额外的参数给Native APP
JSBridge.gotoWebview('http://www.youzan.com', 'goodsDetail', {
goods_id: 10000,
title: '这是商品的标题',
desc: '这是商品的描述'
});
  4.gotoNative(page, data) 从H5页面跳转到Native APP类型的native接口参数必填示例值说明
  页面
  字符串
  是的
  登录页面
  本机页面标识符,例如 loginPage
  数据
  对象
  没有
  { 用户名:'zhangsan',年龄:20 }
  额外的参数对象
  示例代码:
  // 示例1:打开Native APP登录页面
JSBridge.gotoNative('loginPage');
// 示例2:打开Native APP登录页面,并且传递用户名给Native APP
JSBridge.gotoNative('loginPage', {
username: '张三'
});
  5.doAction(action, data) 函数上的一些动作参数 Type 是否必填 示例值 说明
  动作
  字符串
  是的
  复制
  核心方法:PHP如何使用curl实现数据抓取
  PHP如何使用curl实现数据抓取介绍如何使用curl实现数据抓取?以下是为您提供的实现代码。您可以参考代码以获取更多详细信息。代理服务器代理服务器地址httpwwwcnproxycomproxy1htmlHongKongChina的速度比较好 curl_setoptchCURLOPT_PROXYcu
  
  rl_setoptchCURLOPT_URLurlcurl_setoptchCURLOPT_RETURNTRANSFER1returndontprintcurl_setoptchCURLOPT_TIMEOUT30设置超时时间curl_setoptchCURLOPT_USERAGENTMozilla40compatibleMSIE501WindowsNT50curl_setoptchCURLOPT_FOLLOWLOCATION1302redirectcurl_setoptchCURLOPT_MAXREDIRS7HTTp定向级别curl_multi_add_handlemhch把curlresource放进multicurlhandler里handle[i]ch执行domrccurl_multi_execmhrunningifwait_usec0每个connect要间隔多久usleepwa
  
  it_usec250000025secwhilemrcCURLM_CALL_MULTI_PERFORMwhilerunningmrcCURLM_OKifcurl_multi_selectmh-1domrccurl_multi_execmhrunningwhilemrcCURLM_CALL_MULTI_PERFORM读取资料foreachhandleasichcontentcurl_multi_getcontentchdata[i]curl_errnoch0contentfalse移除handleforeachhandleaschcurl_multi_remove_handlemhchcurl_multi_closemhreturndataurlsarrayhttpmapbaiducomreasync_get_urlurlsechore[0]

推荐文章:R从网页抓取到文本分析全教程:影评的获取与分析

网站优化优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2022-09-23 20:16 • 来自相关话题

  推荐文章:R从网页抓取到文本分析全教程:影评的获取与分析
  本期目录
  01
  网页抓取
  02
  中文分词
  03
  文档矩阵
  04
  词频同现
  05
  文本聚类
  06
  主题建模
  07
  情绪分析
  08
  词频统计
  09
  画一个词云
  输入
  随着科技的进步,定量分析的方法不再只通过问卷、二手数据库等方式采集数据,也不再只通过数理统计、回归分析等手段分析数据。针对不同的研究需求,产生了越来越多的新方法和新工具:
  例如以元胞自动机为代表的活体建模技术,以马尔可夫链蒙特卡罗(MCMC)算法为代表的计算机模拟技术等
  本期介绍一个使用爬虫技术爬取网页的实际案例,并对获取的网页文本数据进行后续分析。我将用网友对《流浪地球》豆瓣影评文的获取和分析的全过程作为示范案例。
  文本挖掘的本质是通过自然语言处理(NLP)和分析方法将文本转化为数据进行分析。所以阅读这篇文章需要一定的知识基础,包括网页设计、自然语言处理方法等,我会在文章中适当补充。
  ➡ 1.准备工作
  在分析工作之前,需要对软件的工作环境进行配置,包括设置工作目录、调用需要的包等。采集@收到的文本数据、各种字典、输出结果等> 将保存在工作目录中;首次使用前需要安装外部包。
  ### 准备工作# 设置工作目录setwd('D:/The Wandering Earth')# 加载所需程序包library('rvest')library('stringr')library('jiebaRD')library('jiebaR')library('plyr')library('rJava')library('tm')library('tmcn')library('proxy')library('topicmodels')library('sqldf')library('wordcloud2')
  ➡ 2.网页抓取
  我还是按照定量分析的传统套路,将整个分析过程分为数据采集和数据分析两部分。第一步是通过爬虫技术对网页进行爬取。
  网络爬虫,也称为蜘蛛,是一种自动浏览万维网的网络机器人。它的目的通常是编译一个网络索引。爬虫访问网站的过程会消耗目标系统的资源,很多网络系统默认是不允许爬虫工作的。因此,在访问大量页面时,爬虫需要考虑规划、负载和“礼貌”。不愿被爬虫访问且为爬虫所有者所知的公共网站,可以使用robots.txt文件等方式避免访问。
  例如豆瓣电影()的robots.txt如下:
  User-agent: *Disallow: /subject_searchDisallow: /amazon_searchDisallow: /searchDisallow: /group/searchDisallow: /event/searchDisallow: /celebrities/searchDisallow: /location/drama/searchDisallow: /forum/Disallow: /new_subjectDisallow: /service/iframeDisallow: /j/Disallow: /link2/Disallow: /recommend/Disallow: /doubanapp/cardDisallow: /update/topic/Sitemap: https://www.douban.com/sitemap_index.xmlSitemap: https://www.douban.com/sitemap_updated_index.xml# Crawl-delay: 5<br />User-agent: Wandoujia SpiderDisallow: /
  
  在实际应用中,网络爬虫技术并不是特别复杂。在许多情况下,我们倾向于指定网站 并爬取内容,更喜欢网页采集@> 而不是网络爬虫。在此之前,希望读者对网页的源码有所了解,尤其是标记语言(HTML,只有语法,没有变量和逻辑)、Cascading Style Sheets(CSS,用来控制元素的呈现)、脚本语言(JavaScript),网页设计中添加、删除、修改元素的作用)。
  另外,当网页有比较复杂的表现形式,比如URL分页、超链接、异步加载等,读者需要有更多的理论知识。
<p>### 网页采集# 观察网址规律index 查看全部

  推荐文章:R从网页抓取到文本分析全教程:影评的获取与分析
  本期目录
  01
  网页抓取
  02
  中文分词
  03
  文档矩阵
  04
  词频同现
  05
  文本聚类
  06
  主题建模
  07
  情绪分析
  08
  词频统计
  09
  画一个词云
  输入
  随着科技的进步,定量分析的方法不再只通过问卷、二手数据库等方式采集数据,也不再只通过数理统计、回归分析等手段分析数据。针对不同的研究需求,产生了越来越多的新方法和新工具:
  例如以元胞自动机为代表的活体建模技术,以马尔可夫链蒙特卡罗(MCMC)算法为代表的计算机模拟技术等
  本期介绍一个使用爬虫技术爬取网页的实际案例,并对获取的网页文本数据进行后续分析。我将用网友对《流浪地球》豆瓣影评文的获取和分析的全过程作为示范案例。
  文本挖掘的本质是通过自然语言处理(NLP)和分析方法将文本转化为数据进行分析。所以阅读这篇文章需要一定的知识基础,包括网页设计、自然语言处理方法等,我会在文章中适当补充。
  ➡ 1.准备工作
  在分析工作之前,需要对软件的工作环境进行配置,包括设置工作目录、调用需要的包等。采集@收到的文本数据、各种字典、输出结果等> 将保存在工作目录中;首次使用前需要安装外部包。
  ### 准备工作# 设置工作目录setwd('D:/The Wandering Earth')# 加载所需程序包library('rvest')library('stringr')library('jiebaRD')library('jiebaR')library('plyr')library('rJava')library('tm')library('tmcn')library('proxy')library('topicmodels')library('sqldf')library('wordcloud2')
  ➡ 2.网页抓取
  我还是按照定量分析的传统套路,将整个分析过程分为数据采集和数据分析两部分。第一步是通过爬虫技术对网页进行爬取。
  网络爬虫,也称为蜘蛛,是一种自动浏览万维网的网络机器人。它的目的通常是编译一个网络索引。爬虫访问网站的过程会消耗目标系统的资源,很多网络系统默认是不允许爬虫工作的。因此,在访问大量页面时,爬虫需要考虑规划、负载和“礼貌”。不愿被爬虫访问且为爬虫所有者所知的公共网站,可以使用robots.txt文件等方式避免访问。
  例如豆瓣电影()的robots.txt如下:
  User-agent: *Disallow: /subject_searchDisallow: /amazon_searchDisallow: /searchDisallow: /group/searchDisallow: /event/searchDisallow: /celebrities/searchDisallow: /location/drama/searchDisallow: /forum/Disallow: /new_subjectDisallow: /service/iframeDisallow: /j/Disallow: /link2/Disallow: /recommend/Disallow: /doubanapp/cardDisallow: /update/topic/Sitemap: https://www.douban.com/sitemap_index.xmlSitemap: https://www.douban.com/sitemap_updated_index.xml# Crawl-delay: 5<br />User-agent: Wandoujia SpiderDisallow: /
  
  在实际应用中,网络爬虫技术并不是特别复杂。在许多情况下,我们倾向于指定网站 并爬取内容,更喜欢网页采集@> 而不是网络爬虫。在此之前,希望读者对网页的源码有所了解,尤其是标记语言(HTML,只有语法,没有变量和逻辑)、Cascading Style Sheets(CSS,用来控制元素的呈现)、脚本语言(JavaScript),网页设计中添加、删除、修改元素的作用)。
  另外,当网页有比较复杂的表现形式,比如URL分页、超链接、异步加载等,读者需要有更多的理论知识。
<p>### 网页采集# 观察网址规律index

使用Python爬取知乎回答数据

网站优化优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2022-09-20 19:48 • 来自相关话题

  使用Python爬取知乎回答数据
  import os<br />import json<br />import requests<br />import pandas as pd<br />from bs4 import BeautifulSoup<br /><br />def fetch(next_url):<br /> url = next_url<br /> headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',<br /> 'cookie':' Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1662619350,1662729414,1662813326,1662863065; NOT_UNREGISTER_WAITING=1; __snaker__id=aaLaUJhoCrcgia6P; gdxidpyhxdE=Z4jGxmeqi1HC5PnRKj\d3E\WEnEWkBkK1tpmdQvu6RzwHwXylDsE+fs\tvockccCr9Ab6avhglhdOzLT\37694bL5J\VW\yScB768crPnDtUt85ocmNzD51Wy8UNl69wsyb4y9jyNuGA/izfp+zEJNN/JPhjfJswkP5CMloiLtCgJ/BJ:1662864511703; YD00517437729195:WM_NI=tGzooxLbrz3g7PifRTCu05vFcH+zU5/vTlFvj5KWyGYr0fduFLvW/GVno0Jg90xvhQeo4+fIpjSV6+9EjI78CyP2DCG4X2g9mK1yoKuKeSnqQCh223jYOC/epIZ9YLXZem0=; YD00517437729195:WM_NIKE=9ca17ae2e6ffcda170e2e6ee9bc83c8d9987b9d35aa6ef8fa2c44a938a8a82d54da5a68387c77087e9e1d5f22af0fea7c3b92ab899b690ee7490bebe9bb26df590a787d16081ab00d6f54ea198e59bd83fedaa9c8dc57eaaeb85b8fc4d9bae0087e77f8694bab8ae4d96b2a1d1c96dfbf0b897eb5ba7b1fccce543b4b69db7b521fb9ba6aab63481a7a0d3c74985ec98d3e633af95ff9aee41b795abb4ed7b939da8d3b139aa8781a4ae6fb49796dadc489c86ab8eb337e2a3; captcha_session_v2=2|1:0|10:1662863756|18:captcha_session_v2|88:ZjZEdWhuanlMNHlZOEMzUURLUExmNHVHTkVpTVE5N2pScG5uR3M2blJwbktmc201MWk5Z3FpSTNyVUR2U1gzZg==|58304cc84b91db866170982c9f5431c528f986d61abb523a0b4839a5a1a8c2e2; captcha_ticket_v2=2|1:0|10:1662863773|17:captcha_ticket_v2|704:eyJ2YWxpZGF0ZSI6IkNOMzFfN3RlRWpGVEhJU1dfbzRQZkt6R3dieVhsbWltQTlyMjJSMndXblNsVDJvUGR0Z1VzMERWSG8wMm9ZUUdtNzFoYy0wLWJFMFZ4aXhUNDlKVEx6MUFTbXlwTVpsMC5QU2xzWERmencyYS0uVnBwUDZFQ2F4b3RJLmZhT1lDbkQwV3ZCMlNpRE9mcHVrTExibFExMURtbXpFRU16Ni5GR21lWXBOcTdoX1NSY0hfVndQcFpqVWh5VUQtc05EYlVBdFJZWWQuc1ZyUk5IOXRqWV9DMXRLb1FFLjE5SFVoQ2hDcmQ1YjFjbWlUMEVWV094VlZtUHNYc1BjZk5hdERCaXhYQjA3bDVlUm92Wi1kR3NjbERDOFFpTDFVZ3gxaDdmYVZlOC5zbEx2WHBiQkR2OFVpcTg5T2VyLi1pbFRUOFRpS284dzVrQW1DRVBtMEs0bTlzTXFBQUtpd0dVbjFJSHdRam1kWHc5Mi5xMDBfOXdxOUVJUHJkdWZWbGVRdjZOVUlTNDJ4eWNyc0ZVbENJdDJJU3g5WTJEdWlwc01PUy4yRVo0WXN0QUVZMTh6MWU4RjZZNGJwTi02Y3dPQVIuT2pyZlpkSlVJdWk5c2JWMFJBOXUySGFZNDd5c2t6YjZhUGNTck9tdy5OeHJsa2wuX1Bub3Z0cll5MXk2eTFTMyJ9|a16af6aa89bcea98828d64565d9f7533d1555fede7f5af4ef6f4df2863fcda08; z_c0=2|1:0|10:1662863925|4:z_c0|92:Mi4xbzBfSlBRQUFBQUFBNE5EalpCUHdFU1lBQUFCZ0FsVk5OWmdLWkFCUkdXeWVqVUhRODU5bVRmaVRIRXl2VEJ5MWdB|4191bc8e9a3b0f620ddc0a499e3de9588e5437ed744448a779c0ddc3fc7d3aa1; tst=r; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1662864218; KLBRSID=975d56862ba86eb589d21e89c8d1e74e|1662864248|1662863060'}<br /><br /> res = requests.get(url, headers=headers)<br /> return res.json()<br /># y = fetch()<br /># print(y)<br />def parse(y):<br /> data = y['data'] #data = y['data']= res.json()['data']<br /> next_url = y['paging']['next']<br /> comment_all = []<br /> for item in data:<br /> author = item['target']['author']['name']<br /> content = item['target']['excerpt']<br /> comment_data = [author, content]<br /> comment_all.append(comment_data)<br /> return comment_all, next_url<br />def save(data, path, filename):<br /><br /> if not os.path.exists(path):<br /> os.makedirs(path)<br /> df = pd.DataFrame(data)<br /> df.to_csv(path+filename, encoding='utf_8_sig', mode='a', index=False, sep=',', header=False)<br /><br />if __name__ == '__main__':<br /> next_url = 'https://www.zhihu.com/api/v4/questions/63014725/feeds?cursor=e3cd4f087b3e3cd07c3325d6c31d961b&include=data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,collapsed_by,suggest_edit,comment_count,can_comment,content,editable_content,attachment,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,relevant_info,question,excerpt,is_labeled,paid_info,paid_info_content,reaction_instruction,relationship.is_authorized,is_author,voting,is_thanked,is_nothelp,is_recognized;data[*].mark_infos[*].url;data[*].author.follower_count,vip_info,badge[*].topics;data[*].settings.table_of_content.enabled&limit=5&offset=0&order=default&platform=desktop&session_id=1662864215041635408'<br /> path = 'F:/知乎/'<br /> filename = 'zhihu.csv'<br /> csvHeader =[['用户昵称', '评论内容']]<br /> save(csvHeader, path, filename)#csvheader在这里代替了data被写入到了pd.DateFrame()<br /> while(True):<br /> y = fetch(next_url)<br /> comment_all, next_url = parse(y)<br /> save(comment_all, path, filename)<br /> if next_url == 0:<br /> break<br />
  注意点:
  ①要在headers里面添加cookie,否则返回的是一个空的json数据,建议使用小号的cookie,否则被封号后果自负啊 [狗头.jpg]。
  ②既往的爬取知乎数据的代码主要是利用offset这个偏移量,不过目前它不再变化了。观察Request URL的规律,发现它多了一个变化的cursor参数,而这个cursor参数就是我们的突破口。在抓取的数据包中,我们在['paging']['next']中找到了下一个数据包的网址,我们只需要把下一页的网址不断传入fetch()函数中就可以不断的获取数据包,然后通过获取到的数据包解析我们需要的内容和下一页的url,然后不断循环就能实现爬取答案的目的。
  ③在提取内容时,一个是content,一个是excerpt,excerpt是摘录的意思,内容并不完整,但目前提取content老是报错,我也不知道为啥hhh
  ④退出循环的条件可能并不满足,不过代码还在跑,跑到最后它自己就报错退出了,我觉得不影响使用就没管它hhh
  昨天发了一篇关于微博的推文,不过没看到推送,今天再发一遍。
  import os<br />import json<br />import requests<br />import pandas as pd<br />from bs4 import BeautifulSoup<br />def fetch(max_id):<br /> url = 'https://weibo.com/ajax/statuses/buildComments'<br /> headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'}<br /> params = {'flow': 0,<br /> 'is_reload': 1,<br /> 'id': 4811924297221505,<br /> 'is_show_bulletin': 2,<br /> 'is_mix': 0,<br /> 'max_id': max_id,<br /> 'count': 20,<br /> 'uid': 2803301701}<br /> res = requests.get(url, headers=headers, params=params)<br /> return res.json()<br /># y = fetch()<br /># print(y)<br />def parse(y): #y = fetch()=res.json()<br /> data = y['data'] #y['data']=res.json()['data']<br /> max_id = y['max_id']<br /> comment_all = []<br /> for item in data:<br /> name = item['user']['screen_name']<br /> content = BeautifulSoup(item['text'], 'html.parser').text<br /> date = item['created_at']<br /> likes = item['like_counts']<br /> ip = item['user']['location']<br /> comment_data = [name, content, date, likes, ip]<br /> comment_all.append(comment_data)<br /> return comment_all, max_id<br />def save(data, path, filename):<br /><br /> if not os.path.exists(path):<br /> os.makedirs(path)<br /> df = pd.DataFrame(data)#data参数<br /> df.to_csv(path+filename, encoding='utf_8_sig', mode='a', index=False, sep=',', header=False)<br /><br />if __name__ == '__main__':#注意是两个==<br /> max_id = 0<br /> path = 'F:/微博/'<br /> filename = 'weibo.csv'<br /> csvHeader = [['用户昵称', '评论内容', '评论时间', '被点赞数', '所在城市']]<br /> save(csvHeader, path, filename)#csvheader在这里代替了data被写入了pd.DateFrame()<br /> while(True):<br /> y = fetch(max_id)<br /> comment_all, max_id = parse(y)<br /> save(comment_all, path, filename)<br /> if max_id == 0:<br /> break<br />
  大体思路:
  
  分析网址构造——获取网页数据——解析数据——存储数据。
  ①分析网址构造:
  静态的还是动态的?
  规律:先翻页,后抓包。xhr还是doc?
  微博评论是Ajax动态渲染出来的。
  如何应对Ajax?
  发现请求头的规律,构造函数,伪装成浏览器给服务器发送请求以获得数据。
  ②获得网页数据
  Requests URL 自“?”之后皆为参数,将其写入params中。
  Request Method为get,
  
  使用requests()函数以获取数据,并将返回的函数res.json()
  ③解析数据
  寻找需要的数据,然后遍历,并保存到列表中。
  ④保存数据
  使用dateframe生成一个csv文件,并先行设置好csv的header,当max_id = 0 时退出循环。
  详细内容参见【机灵鹤】公众号,这个博主超赞的!!!
  最后看看结果:
  知乎的↓
  微博的↓ 查看全部

  使用Python爬取知乎回答数据
  import os<br />import json<br />import requests<br />import pandas as pd<br />from bs4 import BeautifulSoup<br /><br />def fetch(next_url):<br /> url = next_url<br /> headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',<br /> 'cookie':' Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1662619350,1662729414,1662813326,1662863065; NOT_UNREGISTER_WAITING=1; __snaker__id=aaLaUJhoCrcgia6P; gdxidpyhxdE=Z4jGxmeqi1HC5PnRKj\d3E\WEnEWkBkK1tpmdQvu6RzwHwXylDsE+fs\tvockccCr9Ab6avhglhdOzLT\37694bL5J\VW\yScB768crPnDtUt85ocmNzD51Wy8UNl69wsyb4y9jyNuGA/izfp+zEJNN/JPhjfJswkP5CMloiLtCgJ/BJ:1662864511703; YD00517437729195:WM_NI=tGzooxLbrz3g7PifRTCu05vFcH+zU5/vTlFvj5KWyGYr0fduFLvW/GVno0Jg90xvhQeo4+fIpjSV6+9EjI78CyP2DCG4X2g9mK1yoKuKeSnqQCh223jYOC/epIZ9YLXZem0=; YD00517437729195:WM_NIKE=9ca17ae2e6ffcda170e2e6ee9bc83c8d9987b9d35aa6ef8fa2c44a938a8a82d54da5a68387c77087e9e1d5f22af0fea7c3b92ab899b690ee7490bebe9bb26df590a787d16081ab00d6f54ea198e59bd83fedaa9c8dc57eaaeb85b8fc4d9bae0087e77f8694bab8ae4d96b2a1d1c96dfbf0b897eb5ba7b1fccce543b4b69db7b521fb9ba6aab63481a7a0d3c74985ec98d3e633af95ff9aee41b795abb4ed7b939da8d3b139aa8781a4ae6fb49796dadc489c86ab8eb337e2a3; captcha_session_v2=2|1:0|10:1662863756|18:captcha_session_v2|88:ZjZEdWhuanlMNHlZOEMzUURLUExmNHVHTkVpTVE5N2pScG5uR3M2blJwbktmc201MWk5Z3FpSTNyVUR2U1gzZg==|58304cc84b91db866170982c9f5431c528f986d61abb523a0b4839a5a1a8c2e2; captcha_ticket_v2=2|1:0|10:1662863773|17:captcha_ticket_v2|704:eyJ2YWxpZGF0ZSI6IkNOMzFfN3RlRWpGVEhJU1dfbzRQZkt6R3dieVhsbWltQTlyMjJSMndXblNsVDJvUGR0Z1VzMERWSG8wMm9ZUUdtNzFoYy0wLWJFMFZ4aXhUNDlKVEx6MUFTbXlwTVpsMC5QU2xzWERmencyYS0uVnBwUDZFQ2F4b3RJLmZhT1lDbkQwV3ZCMlNpRE9mcHVrTExibFExMURtbXpFRU16Ni5GR21lWXBOcTdoX1NSY0hfVndQcFpqVWh5VUQtc05EYlVBdFJZWWQuc1ZyUk5IOXRqWV9DMXRLb1FFLjE5SFVoQ2hDcmQ1YjFjbWlUMEVWV094VlZtUHNYc1BjZk5hdERCaXhYQjA3bDVlUm92Wi1kR3NjbERDOFFpTDFVZ3gxaDdmYVZlOC5zbEx2WHBiQkR2OFVpcTg5T2VyLi1pbFRUOFRpS284dzVrQW1DRVBtMEs0bTlzTXFBQUtpd0dVbjFJSHdRam1kWHc5Mi5xMDBfOXdxOUVJUHJkdWZWbGVRdjZOVUlTNDJ4eWNyc0ZVbENJdDJJU3g5WTJEdWlwc01PUy4yRVo0WXN0QUVZMTh6MWU4RjZZNGJwTi02Y3dPQVIuT2pyZlpkSlVJdWk5c2JWMFJBOXUySGFZNDd5c2t6YjZhUGNTck9tdy5OeHJsa2wuX1Bub3Z0cll5MXk2eTFTMyJ9|a16af6aa89bcea98828d64565d9f7533d1555fede7f5af4ef6f4df2863fcda08; z_c0=2|1:0|10:1662863925|4:z_c0|92:Mi4xbzBfSlBRQUFBQUFBNE5EalpCUHdFU1lBQUFCZ0FsVk5OWmdLWkFCUkdXeWVqVUhRODU5bVRmaVRIRXl2VEJ5MWdB|4191bc8e9a3b0f620ddc0a499e3de9588e5437ed744448a779c0ddc3fc7d3aa1; tst=r; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1662864218; KLBRSID=975d56862ba86eb589d21e89c8d1e74e|1662864248|1662863060'}<br /><br /> res = requests.get(url, headers=headers)<br /> return res.json()<br /># y = fetch()<br /># print(y)<br />def parse(y):<br /> data = y['data'] #data = y['data']= res.json()['data']<br /> next_url = y['paging']['next']<br /> comment_all = []<br /> for item in data:<br /> author = item['target']['author']['name']<br /> content = item['target']['excerpt']<br /> comment_data = [author, content]<br /> comment_all.append(comment_data)<br /> return comment_all, next_url<br />def save(data, path, filename):<br /><br /> if not os.path.exists(path):<br /> os.makedirs(path)<br /> df = pd.DataFrame(data)<br /> df.to_csv(path+filename, encoding='utf_8_sig', mode='a', index=False, sep=',', header=False)<br /><br />if __name__ == '__main__':<br /> next_url = 'https://www.zhihu.com/api/v4/questions/63014725/feeds?cursor=e3cd4f087b3e3cd07c3325d6c31d961b&include=data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,collapsed_by,suggest_edit,comment_count,can_comment,content,editable_content,attachment,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,relevant_info,question,excerpt,is_labeled,paid_info,paid_info_content,reaction_instruction,relationship.is_authorized,is_author,voting,is_thanked,is_nothelp,is_recognized;data[*].mark_infos[*].url;data[*].author.follower_count,vip_info,badge[*].topics;data[*].settings.table_of_content.enabled&limit=5&offset=0&order=default&platform=desktop&session_id=1662864215041635408'<br /> path = 'F:/知乎/'<br /> filename = 'zhihu.csv'<br /> csvHeader =[['用户昵称', '评论内容']]<br /> save(csvHeader, path, filename)#csvheader在这里代替了data被写入到了pd.DateFrame()<br /> while(True):<br /> y = fetch(next_url)<br /> comment_all, next_url = parse(y)<br /> save(comment_all, path, filename)<br /> if next_url == 0:<br /> break<br />
  注意点:
  ①要在headers里面添加cookie,否则返回的是一个空的json数据,建议使用小号的cookie,否则被封号后果自负啊 [狗头.jpg]。
  ②既往的爬取知乎数据的代码主要是利用offset这个偏移量,不过目前它不再变化了。观察Request URL的规律,发现它多了一个变化的cursor参数,而这个cursor参数就是我们的突破口。在抓取的数据包中,我们在['paging']['next']中找到了下一个数据包的网址,我们只需要把下一页的网址不断传入fetch()函数中就可以不断的获取数据包,然后通过获取到的数据包解析我们需要的内容和下一页的url,然后不断循环就能实现爬取答案的目的。
  ③在提取内容时,一个是content,一个是excerpt,excerpt是摘录的意思,内容并不完整,但目前提取content老是报错,我也不知道为啥hhh
  ④退出循环的条件可能并不满足,不过代码还在跑,跑到最后它自己就报错退出了,我觉得不影响使用就没管它hhh
  昨天发了一篇关于微博的推文,不过没看到推送,今天再发一遍。
  import os<br />import json<br />import requests<br />import pandas as pd<br />from bs4 import BeautifulSoup<br />def fetch(max_id):<br /> url = 'https://weibo.com/ajax/statuses/buildComments'<br /> headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'}<br /> params = {'flow': 0,<br /> 'is_reload': 1,<br /> 'id': 4811924297221505,<br /> 'is_show_bulletin': 2,<br /> 'is_mix': 0,<br /> 'max_id': max_id,<br /> 'count': 20,<br /> 'uid': 2803301701}<br /> res = requests.get(url, headers=headers, params=params)<br /> return res.json()<br /># y = fetch()<br /># print(y)<br />def parse(y): #y = fetch()=res.json()<br /> data = y['data'] #y['data']=res.json()['data']<br /> max_id = y['max_id']<br /> comment_all = []<br /> for item in data:<br /> name = item['user']['screen_name']<br /> content = BeautifulSoup(item['text'], 'html.parser').text<br /> date = item['created_at']<br /> likes = item['like_counts']<br /> ip = item['user']['location']<br /> comment_data = [name, content, date, likes, ip]<br /> comment_all.append(comment_data)<br /> return comment_all, max_id<br />def save(data, path, filename):<br /><br /> if not os.path.exists(path):<br /> os.makedirs(path)<br /> df = pd.DataFrame(data)#data参数<br /> df.to_csv(path+filename, encoding='utf_8_sig', mode='a', index=False, sep=',', header=False)<br /><br />if __name__ == '__main__':#注意是两个==<br /> max_id = 0<br /> path = 'F:/微博/'<br /> filename = 'weibo.csv'<br /> csvHeader = [['用户昵称', '评论内容', '评论时间', '被点赞数', '所在城市']]<br /> save(csvHeader, path, filename)#csvheader在这里代替了data被写入了pd.DateFrame()<br /> while(True):<br /> y = fetch(max_id)<br /> comment_all, max_id = parse(y)<br /> save(comment_all, path, filename)<br /> if max_id == 0:<br /> break<br />
  大体思路:
  
  分析网址构造——获取网页数据——解析数据——存储数据。
  ①分析网址构造:
  静态的还是动态的?
  规律:先翻页,后抓包。xhr还是doc?
  微博评论是Ajax动态渲染出来的。
  如何应对Ajax?
  发现请求头的规律,构造函数,伪装成浏览器给服务器发送请求以获得数据。
  ②获得网页数据
  Requests URL 自“?”之后皆为参数,将其写入params中。
  Request Method为get,
  
  使用requests()函数以获取数据,并将返回的函数res.json()
  ③解析数据
  寻找需要的数据,然后遍历,并保存到列表中。
  ④保存数据
  使用dateframe生成一个csv文件,并先行设置好csv的header,当max_id = 0 时退出循环。
  详细内容参见【机灵鹤】公众号,这个博主超赞的!!!
  最后看看结果:
  知乎的↓
  微博的↓

会议预告|2019年IIPC网页存档会议将在克罗地亚萨格勒布召开

网站优化优采云 发表了文章 • 0 个评论 • 37 次浏览 • 2022-09-12 14:30 • 来自相关话题

  会议预告|2019年IIPC网页存档会议将在克罗地亚萨格勒布召开
  Part1 会议简介
  IIPC 网页存档会议将于2019年6月6日和7日在克罗地亚萨格勒布举行。IIPC网页存档会议是一个国际论坛,为网页存档从业者,研究人员,开发人员以及从网页存档开始的人们提供分享经验,传播知识的机会。这也恰逢克罗地亚网络档案馆(HAW)成立15周年。
  第一位主讲人是欧洲平台运营商Europeana Foundation的执行董事Harry Verwayen。他通过广泛提供数字馆藏,支持博物馆、画廊和档案馆进行数字化转型,以便人们可以找到并高效使用它们。
  Part2 About the IIPC
  01成立背景(HISTORY)
  2003年7月,IIPC在法国国家图书馆正式成立,共有12家机构参加。成员们一致同意资助和参加为实现IIPC的目标而设立的项目和工作组。最初的协议有效期为三年,成员仅限于特许机构。IIPC现在向世界各地的图书馆、档案馆、博物馆和文化遗产机构开放,欢迎查询成为会员。
  02身份介绍(WHO WE ARE)
  IIPC成员是来自45个国家的组织,包括国家、大学和区域图书馆和档案馆。成员参加了专注于网络档案内容开发和保存的工作组。领导IIPC由选举产生的指导委员会、成员干事和工作组领导人领导。
  03任务及目标(MISSION & GOALS)
  IIPC的使命是为世界各地的人从互联网获取、保存和提供可获取的知识和信息,促进全球交流和国际关系。
  为实现这一使命,IIPC正在努力实现以下目标:
  
  Part3 About the Web Archiving
  01何为网页存档?
  网页存档是收集万维网的部分内容,以档案格式进行保存,并提供访问和使用服务的过程。
  02为什么要进行网页存档?
  互联网开创了前所未有的知识共享、创造创新和互联的时代,并为负责记录和保存当代知识和文化的机构带来了新挑战。记忆保存机构收集的许多信息内容现在只能在网上获得和使用,如学术出版物,宣传材料,艺术品,政府文件和新闻。随着网页内容不断更新和展现形式的动态化,为留存这些内容,延续传承,必须对网页进行实时捕获和保存。网页资源的可用性和持久性是数字社会中不可忽视的问题。实际中,“链接损坏”现象丛生。由于网页以不保留旧URL的方式关闭或重新设计,使得网络上共享的大量URL在一段时间后不链接,导致网页内容不能继续访问。
  另外,网页内容可能会基于法律因素被官方取消;或由共享它的用户从社交媒体上删除;或者因为“被遗忘的权利”等种种原因被删除。这些现象所反映出的网页内容短暂性的问题,引发了人们关于其对信息的可用性、问责制甚至审查制度的影响的争论。种种情况,使得Web存档服务在当今的信息生态系统中发挥着越来越重要的作用。如Wayback Machine ()它主动地对网页的大部分内容进行存档,允许用户检索和回溯超过3,000亿页的历史网页。存档服务除了解决链接损坏问题外,还有许多其他用途。
  如果你也对网页存档感兴趣的话,可以跟小编一起接着看看这些:
  (1)网页存档过程的工作原理
  An overview of how the process of web archiving works
  目的:弥补现有馆藏的不足并服务不同的目标。
  内容:为文化遗产或作为版权保管制度的一部分的内容。不同组织收集的内容不同,大学一般专注于收集为研究者或教育需求服务的网络档案;公司组织收集的网络档案一般用于法律或记录保存,主要存档网页上的特定文件或站点。
  保存:对网络归档的目的是在不进行修改的情况下保留所收集内容的原始形式。为了实现这一目标,需要适当的工具、标准、策略和最佳实践,以确保随着时间的推移对网络归档的管理。
  访问:网页存档的数据需要使用特殊的软件工具。研究人员可以一页一页地查看存档的web站点,也可以将整个集合作为数据进行处理,从而揭示出集合的广泛特征。隶属于IIPC的组织致力于确保它们的网络档案收藏得到保护,并使未来的研究人员、历史学家和公众能够访问它们。
  (2)IIPC成员开发和使用的工具和软件,用于存档和提供对历史网络资料的访问
  Tools & Software
  存档主要用到的工具有;运用ArchiveBox(原书签存储服务器)来维护来自RSS的提要、书签和链接,利用archivenow(一个Python库)将web资源按需推送到web存档中。并且安装运用Brozzler、crocoite、Heritrix、squidwarf c、Web2Warc等爬虫程序,获取页面并提取链接,获取网页内容,利用SiteStory选择性地捕获和存储在web客户机(浏览器)和web服务器之间发生的事务,并通过WARC输出所抓取的内容,利用html2war将每个简单的脚本转换离线数据,之后使用编年史这一工具进行检索与访问。普通用户通过Social Feed Manager来自Twitter、Tumblr、Flickr和新浪微博公共api的社交媒体。
  
  (3)用于存档Web的众多用例的案例研究
  Case studies
  网站的大规模语料库的捕获为分析文本模式和趋势的提供了无限可能——利用词频分析、文本情感分析、可视化分析等技术提取和分析Web档案馆重的已爬网站,揭示诸如术语之间的共现频率关系,还可以对大量文本执行情感分析,以确定在讨论特定主题时使用的情绪。N-gram检索是一个用语可视化工具,用于绘制用户定义的搜索词或短语随着时间的推移而出现的情况。
  详情可见
  (UK Web Archive: N-gram Search项目)
  随着大型网站被捕获,它们之间的链接也被捕获。通过挖掘这些链接的站点和数据网络,可以观察个人、机构等之间的关系。Common Crawl是一个非营利组织,它对网站进行捕获并向公众免费提供其档案和数据集,以探索不同语言的网站之间的链接并实现其可视化。
  详情可见
  (Babel 2012 Web语言链接项目)
  Part4 总结
  网页存档是收集已记录在万维网上的数据,存储数据,确保数据保存在存档中,并使收集的数据可用于未来研究的过程。互联网档案馆和几个国家图书馆于1996年启动了网页存档实践。国际互联网保护联盟(IIPC)于2003年成立,也极大地促进了国际合作,开发了用于创建网络档案的标准和开源工具。这些发展,以及在网络上创建和记录的人类文化的不断增长的部分,使得网页存档成为越来越不可避免的趋势。图书馆和档案馆以及相关机构必须面对网页存档的挑战并且为应对这些挑战做好准备。
  统稿:孙馨阳
  撰写:孙馨阳、刘贞伶、秦杨、许雅炘、何玉颜
  排版:何玉颜
  审核:李子林、刘俊恒 查看全部

  会议预告|2019年IIPC网页存档会议将在克罗地亚萨格勒布召开
  Part1 会议简介
  IIPC 网页存档会议将于2019年6月6日和7日在克罗地亚萨格勒布举行。IIPC网页存档会议是一个国际论坛,为网页存档从业者,研究人员,开发人员以及从网页存档开始的人们提供分享经验,传播知识的机会。这也恰逢克罗地亚网络档案馆(HAW)成立15周年。
  第一位主讲人是欧洲平台运营商Europeana Foundation的执行董事Harry Verwayen。他通过广泛提供数字馆藏,支持博物馆、画廊和档案馆进行数字化转型,以便人们可以找到并高效使用它们。
  Part2 About the IIPC
  01成立背景(HISTORY)
  2003年7月,IIPC在法国国家图书馆正式成立,共有12家机构参加。成员们一致同意资助和参加为实现IIPC的目标而设立的项目和工作组。最初的协议有效期为三年,成员仅限于特许机构。IIPC现在向世界各地的图书馆、档案馆、博物馆和文化遗产机构开放,欢迎查询成为会员。
  02身份介绍(WHO WE ARE)
  IIPC成员是来自45个国家的组织,包括国家、大学和区域图书馆和档案馆。成员参加了专注于网络档案内容开发和保存的工作组。领导IIPC由选举产生的指导委员会、成员干事和工作组领导人领导。
  03任务及目标(MISSION & GOALS)
  IIPC的使命是为世界各地的人从互联网获取、保存和提供可获取的知识和信息,促进全球交流和国际关系。
  为实现这一使命,IIPC正在努力实现以下目标:
  
  Part3 About the Web Archiving
  01何为网页存档?
  网页存档是收集万维网的部分内容,以档案格式进行保存,并提供访问和使用服务的过程。
  02为什么要进行网页存档?
  互联网开创了前所未有的知识共享、创造创新和互联的时代,并为负责记录和保存当代知识和文化的机构带来了新挑战。记忆保存机构收集的许多信息内容现在只能在网上获得和使用,如学术出版物,宣传材料,艺术品,政府文件和新闻。随着网页内容不断更新和展现形式的动态化,为留存这些内容,延续传承,必须对网页进行实时捕获和保存。网页资源的可用性和持久性是数字社会中不可忽视的问题。实际中,“链接损坏”现象丛生。由于网页以不保留旧URL的方式关闭或重新设计,使得网络上共享的大量URL在一段时间后不链接,导致网页内容不能继续访问。
  另外,网页内容可能会基于法律因素被官方取消;或由共享它的用户从社交媒体上删除;或者因为“被遗忘的权利”等种种原因被删除。这些现象所反映出的网页内容短暂性的问题,引发了人们关于其对信息的可用性、问责制甚至审查制度的影响的争论。种种情况,使得Web存档服务在当今的信息生态系统中发挥着越来越重要的作用。如Wayback Machine ()它主动地对网页的大部分内容进行存档,允许用户检索和回溯超过3,000亿页的历史网页。存档服务除了解决链接损坏问题外,还有许多其他用途。
  如果你也对网页存档感兴趣的话,可以跟小编一起接着看看这些:
  (1)网页存档过程的工作原理
  An overview of how the process of web archiving works
  目的:弥补现有馆藏的不足并服务不同的目标。
  内容:为文化遗产或作为版权保管制度的一部分的内容。不同组织收集的内容不同,大学一般专注于收集为研究者或教育需求服务的网络档案;公司组织收集的网络档案一般用于法律或记录保存,主要存档网页上的特定文件或站点。
  保存:对网络归档的目的是在不进行修改的情况下保留所收集内容的原始形式。为了实现这一目标,需要适当的工具、标准、策略和最佳实践,以确保随着时间的推移对网络归档的管理。
  访问:网页存档的数据需要使用特殊的软件工具。研究人员可以一页一页地查看存档的web站点,也可以将整个集合作为数据进行处理,从而揭示出集合的广泛特征。隶属于IIPC的组织致力于确保它们的网络档案收藏得到保护,并使未来的研究人员、历史学家和公众能够访问它们。
  (2)IIPC成员开发和使用的工具和软件,用于存档和提供对历史网络资料的访问
  Tools & Software
  存档主要用到的工具有;运用ArchiveBox(原书签存储服务器)来维护来自RSS的提要、书签和链接,利用archivenow(一个Python库)将web资源按需推送到web存档中。并且安装运用Brozzler、crocoite、Heritrix、squidwarf c、Web2Warc等爬虫程序,获取页面并提取链接,获取网页内容,利用SiteStory选择性地捕获和存储在web客户机(浏览器)和web服务器之间发生的事务,并通过WARC输出所抓取的内容,利用html2war将每个简单的脚本转换离线数据,之后使用编年史这一工具进行检索与访问。普通用户通过Social Feed Manager来自Twitter、Tumblr、Flickr和新浪微博公共api的社交媒体。
  
  (3)用于存档Web的众多用例的案例研究
  Case studies
  网站的大规模语料库的捕获为分析文本模式和趋势的提供了无限可能——利用词频分析、文本情感分析、可视化分析等技术提取和分析Web档案馆重的已爬网站,揭示诸如术语之间的共现频率关系,还可以对大量文本执行情感分析,以确定在讨论特定主题时使用的情绪。N-gram检索是一个用语可视化工具,用于绘制用户定义的搜索词或短语随着时间的推移而出现的情况。
  详情可见
  (UK Web Archive: N-gram Search项目)
  随着大型网站被捕获,它们之间的链接也被捕获。通过挖掘这些链接的站点和数据网络,可以观察个人、机构等之间的关系。Common Crawl是一个非营利组织,它对网站进行捕获并向公众免费提供其档案和数据集,以探索不同语言的网站之间的链接并实现其可视化。
  详情可见
  (Babel 2012 Web语言链接项目)
  Part4 总结
  网页存档是收集已记录在万维网上的数据,存储数据,确保数据保存在存档中,并使收集的数据可用于未来研究的过程。互联网档案馆和几个国家图书馆于1996年启动了网页存档实践。国际互联网保护联盟(IIPC)于2003年成立,也极大地促进了国际合作,开发了用于创建网络档案的标准和开源工具。这些发展,以及在网络上创建和记录的人类文化的不断增长的部分,使得网页存档成为越来越不可避免的趋势。图书馆和档案馆以及相关机构必须面对网页存档的挑战并且为应对这些挑战做好准备。
  统稿:孙馨阳
  撰写:孙馨阳、刘贞伶、秦杨、许雅炘、何玉颜
  排版:何玉颜
  审核:李子林、刘俊恒

c抓取网页数据c++模拟子线程设计

网站优化优采云 发表了文章 • 0 个评论 • 44 次浏览 • 2022-09-03 01:00 • 来自相关话题

  c抓取网页数据c++模拟子线程设计
  
<p>c抓取网页数据c++设计多线程在多线程编程中,一般来说会使用两个线程,一个是主线程,一个是子线程,大多数情况下,你是看不到两个线程的。所以一个主线程的进程,可以完成多个子线程的功能。通常而言,当一个主线程不能处理全部的工作时,子线程可以使用辅助的线程。下面以c++抓取网页数据c++模拟子线程:#includeintmain(){char*p,i,sz=*hash_std_csv;std::unique_ptrinc;unique_ptrcoi;unique_ptr*hash;hash+=*inc;if(i==&hash){coi=*hash;*hash=inc;}else{sz=*hash;*hash=inc;}continue;}#includeintmain(){inti,o;for(i=0;i 查看全部

  c抓取网页数据c++模拟子线程设计
  
<p>c抓取网页数据c++设计多线程在多线程编程中,一般来说会使用两个线程,一个是主线程,一个是子线程,大多数情况下,你是看不到两个线程的。所以一个主线程的进程,可以完成多个子线程的功能。通常而言,当一个主线程不能处理全部的工作时,子线程可以使用辅助的线程。下面以c++抓取网页数据c++模拟子线程:#includeintmain(){char*p,i,sz=*hash_std_csv;std::unique_ptrinc;unique_ptrcoi;unique_ptr*hash;hash+=*inc;if(i==&hash){coi=*hash;*hash=inc;}else{sz=*hash;*hash=inc;}continue;}#includeintmain(){inti,o;for(i=0;i

学校院级老师专业生的工作经验分享-c抓取网页数据

网站优化优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2022-07-31 19:07 • 来自相关话题

  学校院级老师专业生的工作经验分享-c抓取网页数据
  c抓取网页数据,读写文件,最好是能有特定的格式文件,wxml就很好。支持tcp/ip、http、https。操作的范围广,
  
  php的话js是最基本的吧
  1php就是最好的语言2只用php可以做:网站系统、广告系统3c#系的语言可以用来做web网站和服务器的桌面程序开发,但c#比较复杂,
  
  说一下我想到的,那一般是写个小手机程序,他有自己的逻辑,你可以执行这个逻辑,然后他去服务器接受请求,然后计算,显示数据。至于tcp的话,就是字面上的意思。
  在工厂,数控编程的工作都由机器人来完成,那么,写代码的工作,更是数控编程工作的一个分支吧,所以,这个问题,因为不一定是所有工厂都有完善的自动化工作流程,所以,这个问题在实际生活中,找准分工,
  其实不一定的,当然这是服务器的问题,一个网站的代码由很多代码组成,php和java都是后端的,用于web方面,说说我自己接触的java和php,java的优势在于程序员之间可以很方便地互传文件和控制后端的进程。php在前端可以无缝通过http来实现后端程序的数据处理,虽然可以控制,但是速度还是很慢的,能上unix接触一下shell吧,做服务器,除了要学习一些命令编程和工具的使用外,还要学习这些语言相关的大型网站的架构设计,如果你要独立开发,那你就要设计好要做什么功能,然后设计php和java语言那些开发环境吧,说着说着感觉要变成我们学校院级老师专业生的工作了。 查看全部

  学校院级老师专业生的工作经验分享-c抓取网页数据
  c抓取网页数据,读写文件,最好是能有特定的格式文件,wxml就很好。支持tcp/ip、http、https。操作的范围广,
  
  php的话js是最基本的吧
  1php就是最好的语言2只用php可以做:网站系统、广告系统3c#系的语言可以用来做web网站和服务器的桌面程序开发,但c#比较复杂,
  
  说一下我想到的,那一般是写个小手机程序,他有自己的逻辑,你可以执行这个逻辑,然后他去服务器接受请求,然后计算,显示数据。至于tcp的话,就是字面上的意思。
  在工厂,数控编程的工作都由机器人来完成,那么,写代码的工作,更是数控编程工作的一个分支吧,所以,这个问题,因为不一定是所有工厂都有完善的自动化工作流程,所以,这个问题在实际生活中,找准分工,
  其实不一定的,当然这是服务器的问题,一个网站的代码由很多代码组成,php和java都是后端的,用于web方面,说说我自己接触的java和php,java的优势在于程序员之间可以很方便地互传文件和控制后端的进程。php在前端可以无缝通过http来实现后端程序的数据处理,虽然可以控制,但是速度还是很慢的,能上unix接触一下shell吧,做服务器,除了要学习一些命令编程和工具的使用外,还要学习这些语言相关的大型网站的架构设计,如果你要独立开发,那你就要设计好要做什么功能,然后设计php和java语言那些开发环境吧,说着说着感觉要变成我们学校院级老师专业生的工作了。

化合物信息批量抓取

网站优化优采云 发表了文章 • 0 个评论 • 295 次浏览 • 2022-07-29 05:42 • 来自相关话题

  化合物信息批量抓取
  前段时间老板布置了一项任务,需要收集整理些化合物,于是现学了一些简单爬虫,同时发现了一个针对pubchem中物质信息提取的工具,趁着现在分享给大家!
  爬虫篇我拿到了一些化合物,我想从一个网站中下载该物质的注释信息,但是发现是不能直接下载的,例如图片中红色框中的文字部分,一个一个copy比较浪费时间,于是爬虫ing~
  网站爬虫需要了解下网站的布局,F12键会打开新世界!如下图所示,我们能发现注释信息所在的位置,因此通过爬虫定位到此,批量获取信息!网页爬取太频繁会导致请求失败,可以尝试更换IP或者模拟浏览器进行访问!
  爬虫源码
  """demo28 - 抓取化合物信息<br />Author:CXangDate:2022/7/15"""import timeimport requestsimport lxmlfrom lxml import etreeimport reimport pandas as pdimport bs4<br /># 药物列表# 需要先将待下载化合物名称保存为txt文件"""输入示例:VancomycinDemethylvancomycinTeicoplaninBleomycin"""with open(r"/path/to/your/drugname.txt") as f: content = f.read()lines = [line.split(" ") for line in content.split("\n")]druglist = []for line in lines: druglist += line<br /># 导入网站URLurls = ["https://drugcentral.org/?q={}".format(drug) for drug in druglist]<br /># 建立储存信息字典result = {"name": [], # 药物名称 "define": [] # 药物描述 }<br /><br /># 记录时间-startst = time.time()<br /># 循环遍历# 定义访问休息时间,每个conts大于5则休息几秒的时间count = 0for url in urls: count += 1 print(url) r = requests.get(url,verify=False) html = bs4.BeautifulSoup(r.text, 'html.parser') # 寻找目标内容 all_drugs = html.find("div", class_="content container").find_all("tr") # print(all_drugs) for data in all_drugs: drug_name = data.find("strong", class_="sealine").text drug_define = str(data.find_all(id="sea")) # 字典分割 drug_define = drug_define.split(r'sea">')[1] drug_define = drug_define.split(r'')[0] # 若药物不含有定义描述则返回NA if not drug_define: drug_define = "NA" # print(drug_define) result["name"].append(drug_name) result["define"].append(drug_define) if count > 5: time.sleep(3) count = 0 df = pd.DataFrame(result) df.to_csv(r"/path/to/your/output.csv", index=False)<br /># 记录时间-endet = time.time()# 计算使用时间print(f"All tasks finished, and costs {round(et-st, 2)} seconds.")
  
  抓取结果显示
  PubChemPy
  PubChem就是那个熟悉的化合物大全,涵盖范围很广。包含物质的各种信息,例如名称、分子式、分子量等信息,此时我有一堆化合物名称,我要如何批量拿到物质分子式、分子量等信息呢?一个一个搜索比较浪费时间,无意中发现PubChemPy,PubChemPy是通过python来获取pubchem中相关化合物数据的python库(PubChemPy provides a way to interact with PubChem in Python);
  安装Installation
  PubChemPy 支持Python版本包括2.7, 3.5, and 3.6. 没有各种依赖.可以通过多种方式进行安装,包括pip、conda或者下载压缩包自行安装。
  
  使用Getting started
  import pubchempy as pcpc = pcp.Compound.from_cid(5090)print c.molecular_formula# C17H14O4Sprint c.molecular_weight# 314.35566print c.isomeric_smiles# CS(=O)(=O)C1=CC=C(C=C1)C2=C(C(=O)OC2)C3=CC=CC=C3print c.xlogp# 2.3print c.iupac_name# 3-(4-methylsulfonylphenyl)-4-phenyl-2H-furan-5-oneprint c.synonyms# [u'rofecoxib', u'Vioxx', u'Ceoxx', u'162011-90-7', u'MK 966', ... ]
  尝试通过化合物名称批量获取信息
  # 需要先将待下载化合物名称保存为txt文件。"""输入示例:VancomycinDemethylvancomycinTeicoplaninBleomycin"""<br /># 批量抓取import urllibimport pubchempyimport pandas as pdimport numpy as npwith open('/path/to/your/drugname.txt','r',encoding='utf-8-sig') as file1: file_lines = file1.readlines() name_list=[] a=[] cc=[] d=[] e=[] f=[] g=[]#readlines读取字符串格式,需将其转换成列表格式 for i in file_lines: j=i.strip() #去掉每行头尾空白 name_list.append(str(j)) for k in name_list: results = pubchempy.get_compounds(k, 'name') for l in results: try: print('CID: {}\tMass: {}\tName: {}\tMolfor: {}\tSmi: {}\tSyn: {}'.format(l.cid,l.exact_mass,l.iupac_name,l.molecular_formula,l.isomeric_smiles,l.synonyms)) MFs=l.molecular_formula MWs=l.molecular_weight ISs=l.isomeric_smiles Sys=l.synonyms Cis=l.cid a.append(k) cc.append(MFs) d.append(ISs) e.append(Sys) f.append(Cis) g.append(MWs) except (pubchempy.BadRequestError,TimeoutError,urllib.error.URLError,ValueError): pass dataframe=pd.DataFrame({'name':a, 'molecular_formula':cc, 'molecular_weight':g, 'isomeric_smiles':d, 'synonyms':e, 'cid':f}) # outputpath是保存文件路径 outputpath = '/path/to/your/output.csv' dataframe.to_csv (outputpath,index=False,sep=',')
  抓取结果显示
  写在最后
  匆忙之中完成此次更新,如有问题欢迎后台交流呀~ 查看全部

  化合物信息批量抓取
  前段时间老板布置了一项任务,需要收集整理些化合物,于是现学了一些简单爬虫,同时发现了一个针对pubchem中物质信息提取的工具,趁着现在分享给大家!
  爬虫篇我拿到了一些化合物,我想从一个网站中下载该物质的注释信息,但是发现是不能直接下载的,例如图片中红色框中的文字部分,一个一个copy比较浪费时间,于是爬虫ing~
  网站爬虫需要了解下网站的布局,F12键会打开新世界!如下图所示,我们能发现注释信息所在的位置,因此通过爬虫定位到此,批量获取信息!网页爬取太频繁会导致请求失败,可以尝试更换IP或者模拟浏览器进行访问!
  爬虫源码
  """demo28 - 抓取化合物信息<br />Author:CXangDate:2022/7/15"""import timeimport requestsimport lxmlfrom lxml import etreeimport reimport pandas as pdimport bs4<br /># 药物列表# 需要先将待下载化合物名称保存为txt文件"""输入示例:VancomycinDemethylvancomycinTeicoplaninBleomycin"""with open(r"/path/to/your/drugname.txt") as f: content = f.read()lines = [line.split(" ") for line in content.split("\n")]druglist = []for line in lines: druglist += line<br /># 导入网站URLurls = ["https://drugcentral.org/?q={}".format(drug) for drug in druglist]<br /># 建立储存信息字典result = {"name": [], # 药物名称 "define": [] # 药物描述 }<br /><br /># 记录时间-startst = time.time()<br /># 循环遍历# 定义访问休息时间,每个conts大于5则休息几秒的时间count = 0for url in urls: count += 1 print(url) r = requests.get(url,verify=False) html = bs4.BeautifulSoup(r.text, 'html.parser') # 寻找目标内容 all_drugs = html.find("div", class_="content container").find_all("tr") # print(all_drugs) for data in all_drugs: drug_name = data.find("strong", class_="sealine").text drug_define = str(data.find_all(id="sea")) # 字典分割 drug_define = drug_define.split(r'sea">')[1] drug_define = drug_define.split(r'')[0] # 若药物不含有定义描述则返回NA if not drug_define: drug_define = "NA" # print(drug_define) result["name"].append(drug_name) result["define"].append(drug_define) if count > 5: time.sleep(3) count = 0 df = pd.DataFrame(result) df.to_csv(r"/path/to/your/output.csv", index=False)<br /># 记录时间-endet = time.time()# 计算使用时间print(f"All tasks finished, and costs {round(et-st, 2)} seconds.")
  
  抓取结果显示
  PubChemPy
  PubChem就是那个熟悉的化合物大全,涵盖范围很广。包含物质的各种信息,例如名称、分子式、分子量等信息,此时我有一堆化合物名称,我要如何批量拿到物质分子式、分子量等信息呢?一个一个搜索比较浪费时间,无意中发现PubChemPy,PubChemPy是通过python来获取pubchem中相关化合物数据的python库(PubChemPy provides a way to interact with PubChem in Python);
  安装Installation
  PubChemPy 支持Python版本包括2.7, 3.5, and 3.6. 没有各种依赖.可以通过多种方式进行安装,包括pip、conda或者下载压缩包自行安装。
  
  使用Getting started
  import pubchempy as pcpc = pcp.Compound.from_cid(5090)print c.molecular_formula# C17H14O4Sprint c.molecular_weight# 314.35566print c.isomeric_smiles# CS(=O)(=O)C1=CC=C(C=C1)C2=C(C(=O)OC2)C3=CC=CC=C3print c.xlogp# 2.3print c.iupac_name# 3-(4-methylsulfonylphenyl)-4-phenyl-2H-furan-5-oneprint c.synonyms# [u'rofecoxib', u'Vioxx', u'Ceoxx', u'162011-90-7', u'MK 966', ... ]
  尝试通过化合物名称批量获取信息
  # 需要先将待下载化合物名称保存为txt文件。"""输入示例:VancomycinDemethylvancomycinTeicoplaninBleomycin"""<br /># 批量抓取import urllibimport pubchempyimport pandas as pdimport numpy as npwith open('/path/to/your/drugname.txt','r',encoding='utf-8-sig') as file1: file_lines = file1.readlines() name_list=[] a=[] cc=[] d=[] e=[] f=[] g=[]#readlines读取字符串格式,需将其转换成列表格式 for i in file_lines: j=i.strip() #去掉每行头尾空白 name_list.append(str(j)) for k in name_list: results = pubchempy.get_compounds(k, 'name') for l in results: try: print('CID: {}\tMass: {}\tName: {}\tMolfor: {}\tSmi: {}\tSyn: {}'.format(l.cid,l.exact_mass,l.iupac_name,l.molecular_formula,l.isomeric_smiles,l.synonyms)) MFs=l.molecular_formula MWs=l.molecular_weight ISs=l.isomeric_smiles Sys=l.synonyms Cis=l.cid a.append(k) cc.append(MFs) d.append(ISs) e.append(Sys) f.append(Cis) g.append(MWs) except (pubchempy.BadRequestError,TimeoutError,urllib.error.URLError,ValueError): pass dataframe=pd.DataFrame({'name':a, 'molecular_formula':cc, 'molecular_weight':g, 'isomeric_smiles':d, 'synonyms':e, 'cid':f}) # outputpath是保存文件路径 outputpath = '/path/to/your/output.csv' dataframe.to_csv (outputpath,index=False,sep=',')
  抓取结果显示
  写在最后
  匆忙之中完成此次更新,如有问题欢迎后台交流呀~

c抓取网页数据有什么好大惊小怪的吗

网站优化优采云 发表了文章 • 0 个评论 • 58 次浏览 • 2022-07-20 16:03 • 来自相关话题

  c抓取网页数据有什么好大惊小怪的吗
  c抓取网页数据有什么好大惊小怪的吗?不觉得。如果是r,reveal,python,我们一般是处理网页源代码,这样可以获取到网页的不同模块及作用。例如,我们根据网页中的标识找到感兴趣的内容(将网页划分为webpage),我们用正则表达式,通过正则表达式找到页面中的值,也可以找到网页所描述的类型等等。当然,我们有更高级的数据分析目的。
  
  但是,网页实在是太大了,要获取完整网页,方法千千万万,就需要人工处理。我们现在要有个工具,可以自动采集网页数据,而且数据量又小,简直是伟大啊~其实c爬虫网页数据的方法也非常简单,在家无聊时拿下首页数据集练练手吧~参考网址:。
  
  我从某狗答案中看到了支付宝的数据抓取,据说动态和反爬虫技术非常厉害,话说他的大神回答的图片中并没有数据爬取,主要还是前期的准备和抓取代码的自己加工。其实关键是定位到爬取的页面元素,然后设计代码,进行抓取。
  python爬数据的就是抓取页面元素获取数据而已啊,但是你有没有想过为什么页面数据抓取出来要加上反爬虫这个神秘的套路。我想给大家介绍一下爬虫的两种用法。beautifulsoup()就是爬虫。这个网站是我最近从一个网站上爬的。以下内容没用看懂的自己百度。链接:-3-1--这个网站是北京某市的一个市场数据库网站,以下是爬取的结果所以你可以根据自己的需要,自己分析和上手干干净净的数据;或者你也可以需要做页面分析,自己来写爬虫或者c、python爬虫开发工具,也就是楼上的观测数据库网站?最后再讲一下最后给大家推荐个网站::,还可以免费试用发一些体会。 查看全部

  c抓取网页数据有什么好大惊小怪的吗
  c抓取网页数据有什么好大惊小怪的吗?不觉得。如果是r,reveal,python,我们一般是处理网页源代码,这样可以获取到网页的不同模块及作用。例如,我们根据网页中的标识找到感兴趣的内容(将网页划分为webpage),我们用正则表达式,通过正则表达式找到页面中的值,也可以找到网页所描述的类型等等。当然,我们有更高级的数据分析目的。
  
  但是,网页实在是太大了,要获取完整网页,方法千千万万,就需要人工处理。我们现在要有个工具,可以自动采集网页数据,而且数据量又小,简直是伟大啊~其实c爬虫网页数据的方法也非常简单,在家无聊时拿下首页数据集练练手吧~参考网址:。
  
  我从某狗答案中看到了支付宝的数据抓取,据说动态和反爬虫技术非常厉害,话说他的大神回答的图片中并没有数据爬取,主要还是前期的准备和抓取代码的自己加工。其实关键是定位到爬取的页面元素,然后设计代码,进行抓取。
  python爬数据的就是抓取页面元素获取数据而已啊,但是你有没有想过为什么页面数据抓取出来要加上反爬虫这个神秘的套路。我想给大家介绍一下爬虫的两种用法。beautifulsoup()就是爬虫。这个网站是我最近从一个网站上爬的。以下内容没用看懂的自己百度。链接:-3-1--这个网站是北京某市的一个市场数据库网站,以下是爬取的结果所以你可以根据自己的需要,自己分析和上手干干净净的数据;或者你也可以需要做页面分析,自己来写爬虫或者c、python爬虫开发工具,也就是楼上的观测数据库网站?最后再讲一下最后给大家推荐个网站::,还可以免费试用发一些体会。

c抓取网页数据可以用urllib2,可以抓取io效率有点低

网站优化优采云 发表了文章 • 0 个评论 • 45 次浏览 • 2022-07-17 15:08 • 来自相关话题

  c抓取网页数据可以用urllib2,可以抓取io效率有点低
  c抓取网页数据可以用urllib2,可以抓取成功,就是io效率有点低。你可以看看urllib包能抓哪些网页,然后从里面挑效率高的来用。urllib2有ajax异步请求,抓取xml也可以用。
  
  报错,可能是你c语言版本不高。libxml2是通用的xml文件解析库。你可以从libxml2的官方网站,下一个对应的apk,安装到手机上,这样libxml2这个库就能在安卓手机上使用了。
  
  相比当年的cqt,微软用qml也用自己的ui库来把c++工程模块化,可以减少一些开发难度。但是微软的qml自己那个库做的确实很差很烂。所以微软的工程师才一直追着undoct学习,你看有多少好的库是undoct搞出来的。本人看过undoctinnetworkenginewiki(undoctinnetworkenginewiki),每次看完就给我这种感觉:whyshit!好吧对了,xx手机系统现在基本都支持qml的。到时候修改一下就能拿到所有的数据。
  你可以先从c++抓取不能在其他系统上被优化的windowsapi方面入手,然后对excel这个windows上可以使用的api有兴趣的话,可以从winform的api入手,但是如果你对c++的http相关的api非常感兴趣也可以研究下eventhttp之类的,如果非常不感兴趣的话,也可以往编程语言标准库上转转,但是如果你c++水平已经差不多可以自己动手做东西的话,java这个作为工作语言也是非常合适的,为啥没必要重头学一门后端语言呢。 查看全部

  c抓取网页数据可以用urllib2,可以抓取io效率有点低
  c抓取网页数据可以用urllib2,可以抓取成功,就是io效率有点低。你可以看看urllib包能抓哪些网页,然后从里面挑效率高的来用。urllib2有ajax异步请求,抓取xml也可以用。
  
  报错,可能是你c语言版本不高。libxml2是通用的xml文件解析库。你可以从libxml2的官方网站,下一个对应的apk,安装到手机上,这样libxml2这个库就能在安卓手机上使用了。
  
  相比当年的cqt,微软用qml也用自己的ui库来把c++工程模块化,可以减少一些开发难度。但是微软的qml自己那个库做的确实很差很烂。所以微软的工程师才一直追着undoct学习,你看有多少好的库是undoct搞出来的。本人看过undoctinnetworkenginewiki(undoctinnetworkenginewiki),每次看完就给我这种感觉:whyshit!好吧对了,xx手机系统现在基本都支持qml的。到时候修改一下就能拿到所有的数据。
  你可以先从c++抓取不能在其他系统上被优化的windowsapi方面入手,然后对excel这个windows上可以使用的api有兴趣的话,可以从winform的api入手,但是如果你对c++的http相关的api非常感兴趣也可以研究下eventhttp之类的,如果非常不感兴趣的话,也可以往编程语言标准库上转转,但是如果你c++水平已经差不多可以自己动手做东西的话,java这个作为工作语言也是非常合适的,为啥没必要重头学一门后端语言呢。

中post存储信息的方式存放(c抓取)(组图)

网站优化优采云 发表了文章 • 0 个评论 • 41 次浏览 • 2022-07-06 17:07 • 来自相关话题

  中post存储信息的方式存放(c抓取)(组图)
  c抓取网页数据处理后存放在cookie中post存储信息的方式存放在对象中一个driver对象存放cookie和post信息cookie存放在不同的域下有不同的生命周期(默认的容许重定向:七天)post存储信息的方式存放在对象中一个driver对象存放data中每个driver生命周期中创建并销毁只需要新建一个driver对象cocoapods和cocoaplugins是一对多关系cocoapods相当于cocoapodsplugins相当于cocoaplus定制的代码一定要标注好包名和package这些都是很好找的另一个flutterconstantslibrary这个库可以定制很多constants的生命周期referenced这个constants生命周期的默认值是old,refresh,update,returnarguments请遵循guido/gcc·github尽量使用全局的refresh,比如'outref'on'final'gcope如果需要指定refresh的整数个数请注意一个实例只需要在必要的时候执行一次赋值即可。
  
  但是如果这个实例真的在整个生命周期中都没有被执行赋值而flutter的内存受限情况,这个时候默认是相当于执行完整个生命周期。flutter一般使用namespace,而namespace除了字符串非固定以外没有什么好的方式可以简化的获取某一个实例的refresh的值如果需要add某个refresh,请直接add这个标签namespacecocoapods一个channel分成两组flutterchannel和nativechannel。
  
  如果未来你想要相互调用,请考虑构造一个nativechannel,也就是两个channel是对等的,而flutterchannel只是作为nativechannel的一个implementation/default而已。注意在flutter和native中的accessvalue可能不一样。分组是因为native和flutter是解耦的,flutter也要遵循google官方的cookiesocketapi。
  想要使用flutterchannel必须先尝试取消封装了channel和objective-c命名空间。想要构造jsonchannel,请改为nativechannel有关于refresh的一些事情;以及:1.使用cocoapodsbuildtheflutterapp2.使用valgrindvalgrind3.不推荐以下形式生成flutter代码,因为yarn会linkchannels,所以会重复工作。 查看全部

  中post存储信息的方式存放(c抓取)(组图)
  c抓取网页数据处理后存放在cookie中post存储信息的方式存放在对象中一个driver对象存放cookie和post信息cookie存放在不同的域下有不同的生命周期(默认的容许重定向:七天)post存储信息的方式存放在对象中一个driver对象存放data中每个driver生命周期中创建并销毁只需要新建一个driver对象cocoapods和cocoaplugins是一对多关系cocoapods相当于cocoapodsplugins相当于cocoaplus定制的代码一定要标注好包名和package这些都是很好找的另一个flutterconstantslibrary这个库可以定制很多constants的生命周期referenced这个constants生命周期的默认值是old,refresh,update,returnarguments请遵循guido/gcc·github尽量使用全局的refresh,比如'outref'on'final'gcope如果需要指定refresh的整数个数请注意一个实例只需要在必要的时候执行一次赋值即可。
  
  但是如果这个实例真的在整个生命周期中都没有被执行赋值而flutter的内存受限情况,这个时候默认是相当于执行完整个生命周期。flutter一般使用namespace,而namespace除了字符串非固定以外没有什么好的方式可以简化的获取某一个实例的refresh的值如果需要add某个refresh,请直接add这个标签namespacecocoapods一个channel分成两组flutterchannel和nativechannel。
  
  如果未来你想要相互调用,请考虑构造一个nativechannel,也就是两个channel是对等的,而flutterchannel只是作为nativechannel的一个implementation/default而已。注意在flutter和native中的accessvalue可能不一样。分组是因为native和flutter是解耦的,flutter也要遵循google官方的cookiesocketapi。
  想要使用flutterchannel必须先尝试取消封装了channel和objective-c命名空间。想要构造jsonchannel,请改为nativechannel有关于refresh的一些事情;以及:1.使用cocoapodsbuildtheflutterapp2.使用valgrindvalgrind3.不推荐以下形式生成flutter代码,因为yarn会linkchannels,所以会重复工作。

excel2016猴子500强面试题2014基金数据源_文献数据去重-环境实验室

网站优化优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2022-06-30 23:03 • 来自相关话题

  excel2016猴子500强面试题2014基金数据源_文献数据去重-环境实验室
  c抓取网页数据的工具scrapy-scrapy的通用模块aspectj转sqlite的工具使用记录神器workflowy网页上的动态日志产生方法webpack的使用大数据开发的工具及平台pandas库常用的常见绘图工具bokeh,matplotlib,seabornmatplotlib绘图集中的三种绘图方式roc曲线(回归分析中的曲线)islayer(目前比较少用,功能简单,图形花哨)csvexportertopandas文件包含方法iplot(画柱状图)spine(画折线图)adjline(曲线折线函数:sqrt,abs,phqr,np。exp(n1+n。
  
  2))keto(数据图形index,bars,scatter=none)scatterplot(画趋势线)midpoint(histogram图形函数:(x1,y1,x2,y
  
  2),left=right=bottom=bottom)plot(y1,y2,bar,k=
  8)plotline(线)cvx(图形数组w*h,值类型与x共同,包含5个坐标轴。默认不增加图形大小,x轴纵坐标用于表示颜色,y轴纵坐标用于表示数值。x=root+list(x1*h),y=root+list(y1*h)),x1,y1=x*w,y*h对比web自动刷新python2016年的文章链接,指定时间,地点-hd4fxxtosqc成都优采云站抓取同程网房价图2014_adjline(爬虫模拟登录图像采集器)常用图表制作php小方框图2016用户注册信息采集2015北京房价采集2015选区分割条件图(gbk)2016猴子500强面试题2014基金数据分析12014初筛数据源_文献数据去重-环境实验室_新浪博客数据处理-绿色数据清洗-七牛云万语相传2014检索结果取消重复检索关键字过滤2016其他工具使用2高维数据表下载成excel2015下图可以看出需要可视化出柱状图,我想问下excel2016还有没有办法直接画出来?-广播的回答我怎么搞?-vincentvongraafsu-2015破2000,专注大数据更多讨论交流。关注微信公众号“七牛云大数据”,与您共同探索大数据带来的价值!。 查看全部

  excel2016猴子500强面试题2014基金数据源_文献数据去重-环境实验室
  c抓取网页数据的工具scrapy-scrapy的通用模块aspectj转sqlite的工具使用记录神器workflowy网页上的动态日志产生方法webpack的使用大数据开发的工具及平台pandas库常用的常见绘图工具bokeh,matplotlib,seabornmatplotlib绘图集中的三种绘图方式roc曲线(回归分析中的曲线)islayer(目前比较少用,功能简单,图形花哨)csvexportertopandas文件包含方法iplot(画柱状图)spine(画折线图)adjline(曲线折线函数:sqrt,abs,phqr,np。exp(n1+n。
  
  2))keto(数据图形index,bars,scatter=none)scatterplot(画趋势线)midpoint(histogram图形函数:(x1,y1,x2,y
  
  2),left=right=bottom=bottom)plot(y1,y2,bar,k=
  8)plotline(线)cvx(图形数组w*h,值类型与x共同,包含5个坐标轴。默认不增加图形大小,x轴纵坐标用于表示颜色,y轴纵坐标用于表示数值。x=root+list(x1*h),y=root+list(y1*h)),x1,y1=x*w,y*h对比web自动刷新python2016年的文章链接,指定时间,地点-hd4fxxtosqc成都优采云站抓取同程网房价图2014_adjline(爬虫模拟登录图像采集器)常用图表制作php小方框图2016用户注册信息采集2015北京房价采集2015选区分割条件图(gbk)2016猴子500强面试题2014基金数据分析12014初筛数据源_文献数据去重-环境实验室_新浪博客数据处理-绿色数据清洗-七牛云万语相传2014检索结果取消重复检索关键字过滤2016其他工具使用2高维数据表下载成excel2015下图可以看出需要可视化出柱状图,我想问下excel2016还有没有办法直接画出来?-广播的回答我怎么搞?-vincentvongraafsu-2015破2000,专注大数据更多讨论交流。关注微信公众号“七牛云大数据”,与您共同探索大数据带来的价值!。

爬虫万金油,一鹅在手,抓遍全球

网站优化优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-06-26 07:22 • 来自相关话题

  爬虫万金油,一鹅在手,抓遍全球
  爬虫抓取数据有两个头疼的点,写过爬虫的小伙伴们一定都深有体会:
  网站的防抓取机制。你要尽可能将自己伪装成“一个人”,骗过对方的服务器反爬验证。
  网站的内容提取。每个网站都需要你做不同的处理,而且网站一旦改版,你的代码也得跟着更新。
  第一点没什么捷径可走,套路见得多了,也就有经验了。关于第二点,今天咱们就来介绍一个小工具,在某些需求场景下,或许可以给你省不少事。
  Goose
  Goose 是一个文章内容提取器,可以从任意资讯文章类的网页中提取文章主体,并提取标题、标签、摘要、图片、视频等信息,且支持中文网页。它最初是由 用 Java 编写的。python-goose 是用 Python 重写的版本。
  有了这个库,你从网上爬下来的网页可以直接获取正文内容,无需再用 bs4 或正则表达式一个个去处理文本。
  项目地址:
  (py2)
  (py3)
  安装
  网上大多数教程提到的 python-goose 项目目前只支持到 python 2.7。可以通过 pip 安装:
  pip install goose-extractor
  或者安装官网上的方法从源代码安装:
  mkvirtualenv --no-site-packages goose
git clone https://github.com/grangier/python-goose.git
cd python-goose
pip install -r requirements.txt
python setup.py install
  我找到一个 python 3 的版本 goose3:
  pip install goose3
  经过我一些简单的测试,未发现两个版本在结果上有太大的差异。
  快速上手
  这里使用 goose3,而 python-goose 只要把其中的 goose3 改成 goose 即可,接口都是一样的。以我之前发过的一篇文章 为抓取目标来做个演示。
  from goose3 import Goose
from goose3.text import StopWordsChinese
# 初始化,设置中文分词
g = Goose({'stopwords_class': StopWordsChinese})
# 文章地址
url = 'https://mp.weixin.qq.com/s/zflbcF5PS06QC5YJXpiviQ'
# 获取文章内容
article = g.extract(url=url)
# 标题
print('标题:', article.title)
# 显示正文
print(article.cleaned_text)
  输出:
  除了标题 title 和正文 cleaned_text 外,还可以获取一些额外的信息,比如:
  如有有些网站限制了程序抓取,也可以根据需要添加 user-agent 信息:
  
  g = Goose({'browser_user_agent': 'Version/5.1.2 Safari/534.52.7'})
  如果是 goose3,因为使用了 requests 库作为请求模块,因此还可以以相似方式配置 headers、proxies 等属性。
  在上述示例中使用到的 StopWordsChinese 为中文分词器,可一定程度上提高中文文章的识别准确率,但更耗时。
  其他说明
  1.
  Goose 虽然方便,但并不能保证每个网站都能精确获取,因此适合大规模文章的采集,如热点追踪、舆情分析等。它只能从概率上保证大多数网站可以相对准确地抓取。我经过一些尝试后发现,抓取英文网站优于中文网站,主流网站优于小众网站,文本的提取优于图片的提取。
  2.
  从项目中的 requirements.txt 文件可以看出,goose 中使用到了 Pillow、lxml、cssselect、jieba、beautifulsoup、nltk,goose3 还用到了 requests,我们之前很多文章和项目中都有所涉及:
  3.
  如果你是使用基于 python2 的 goose,有可能会遇到编码上的问题(尤其是 windows 上)。这方面可以在公众号对话里回复关键词 编码,我们有过相关的讲解。
  4.
  除了 goose 外,还有其他的正文提取库可以尝试,比如 python-boilerpipe、python-readability 等。
  实例
  最后,我们来用 goose3 写小一段代码,自动抓取 爱范儿、雷锋网、DoNews 上的新闻文章:
  from goose3 import Goose
from goose3.text import StopWordsChinese
from bs4 import BeautifulSoup
g = Goose({'stopwords_class': StopWordsChinese})
urls = [
   'https://www.ifanr.com/',
   'https://www.leiphone.com/',
   'http://www.donews.com/'
]
url_articles = []
for url in urls:
   page = g.extract(url=url)
   soup = BeautifulSoup(page.raw_html, 'lxml')
   links = soup.find_all('a')
   for l in links:
       link = l.get('href')
       if link and link.startswith('http') and any(c.isdigit() for c in link if c) and link not in url_articles:
           url_articles.append(link)
           print(link)
for url in url_articles:
   try:
       article = g.extract(url=url)
       content = article.cleaned_text
       if len(content) > 200:
           title = article.title
           print(title)
           with open('homework/goose/' + title + '.txt', 'w') as f:
               f.write(content)
   except:
       pass
  这段程序所做的事情就是: 查看全部

  爬虫万金油,一鹅在手,抓遍全球
  爬虫抓取数据有两个头疼的点,写过爬虫的小伙伴们一定都深有体会:
  网站的防抓取机制。你要尽可能将自己伪装成“一个人”,骗过对方的服务器反爬验证。
  网站的内容提取。每个网站都需要你做不同的处理,而且网站一旦改版,你的代码也得跟着更新。
  第一点没什么捷径可走,套路见得多了,也就有经验了。关于第二点,今天咱们就来介绍一个小工具,在某些需求场景下,或许可以给你省不少事。
  Goose
  Goose 是一个文章内容提取器,可以从任意资讯文章类的网页中提取文章主体,并提取标题、标签、摘要、图片、视频等信息,且支持中文网页。它最初是由 用 Java 编写的。python-goose 是用 Python 重写的版本。
  有了这个库,你从网上爬下来的网页可以直接获取正文内容,无需再用 bs4 或正则表达式一个个去处理文本。
  项目地址:
  (py2)
  (py3)
  安装
  网上大多数教程提到的 python-goose 项目目前只支持到 python 2.7。可以通过 pip 安装:
  pip install goose-extractor
  或者安装官网上的方法从源代码安装:
  mkvirtualenv --no-site-packages goose
git clone https://github.com/grangier/python-goose.git
cd python-goose
pip install -r requirements.txt
python setup.py install
  我找到一个 python 3 的版本 goose3:
  pip install goose3
  经过我一些简单的测试,未发现两个版本在结果上有太大的差异。
  快速上手
  这里使用 goose3,而 python-goose 只要把其中的 goose3 改成 goose 即可,接口都是一样的。以我之前发过的一篇文章 为抓取目标来做个演示。
  from goose3 import Goose
from goose3.text import StopWordsChinese
# 初始化,设置中文分词
g = Goose({'stopwords_class': StopWordsChinese})
# 文章地址
url = 'https://mp.weixin.qq.com/s/zflbcF5PS06QC5YJXpiviQ'
# 获取文章内容
article = g.extract(url=url)
# 标题
print('标题:', article.title)
# 显示正文
print(article.cleaned_text)
  输出:
  除了标题 title 和正文 cleaned_text 外,还可以获取一些额外的信息,比如:
  如有有些网站限制了程序抓取,也可以根据需要添加 user-agent 信息:
  
  g = Goose({'browser_user_agent': 'Version/5.1.2 Safari/534.52.7'})
  如果是 goose3,因为使用了 requests 库作为请求模块,因此还可以以相似方式配置 headers、proxies 等属性。
  在上述示例中使用到的 StopWordsChinese 为中文分词器,可一定程度上提高中文文章的识别准确率,但更耗时。
  其他说明
  1.
  Goose 虽然方便,但并不能保证每个网站都能精确获取,因此适合大规模文章的采集,如热点追踪、舆情分析等。它只能从概率上保证大多数网站可以相对准确地抓取。我经过一些尝试后发现,抓取英文网站优于中文网站,主流网站优于小众网站,文本的提取优于图片的提取。
  2.
  从项目中的 requirements.txt 文件可以看出,goose 中使用到了 Pillow、lxml、cssselect、jieba、beautifulsoup、nltk,goose3 还用到了 requests,我们之前很多文章和项目中都有所涉及:
  3.
  如果你是使用基于 python2 的 goose,有可能会遇到编码上的问题(尤其是 windows 上)。这方面可以在公众号对话里回复关键词 编码,我们有过相关的讲解。
  4.
  除了 goose 外,还有其他的正文提取库可以尝试,比如 python-boilerpipe、python-readability 等。
  实例
  最后,我们来用 goose3 写小一段代码,自动抓取 爱范儿、雷锋网、DoNews 上的新闻文章:
  from goose3 import Goose
from goose3.text import StopWordsChinese
from bs4 import BeautifulSoup
g = Goose({'stopwords_class': StopWordsChinese})
urls = [
   'https://www.ifanr.com/',
   'https://www.leiphone.com/',
   'http://www.donews.com/'
]
url_articles = []
for url in urls:
   page = g.extract(url=url)
   soup = BeautifulSoup(page.raw_html, 'lxml')
   links = soup.find_all('a')
   for l in links:
       link = l.get('href')
       if link and link.startswith('http') and any(c.isdigit() for c in link if c) and link not in url_articles:
           url_articles.append(link)
           print(link)
for url in url_articles:
   try:
       article = g.extract(url=url)
       content = article.cleaned_text
       if len(content) > 200:
           title = article.title
           print(title)
           with open('homework/goose/' + title + '.txt', 'w') as f:
               f.write(content)
   except:
       pass
  这段程序所做的事情就是:

c 抓取网页数据 关注:“即使断网

网站优化优采云 发表了文章 • 0 个评论 • 43 次浏览 • 2022-06-25 15:41 • 来自相关话题

  c 抓取网页数据 关注:“即使断网
  知名CMS系统网站搭建商创始人构建第一个Web3.0网站 更喜欢IPFS API而不是亚马逊专有API
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。
  CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  近日,
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth.两者都是ENS 域名。ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD.eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。因此,如果您拥有DNS,则可以使用ENS Domains 网站为.
  第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。从理论上讲,IPFS比传统的网站托管更具弹性。由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  (1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。
  运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。我找到了十几个固定服务,并尝试了以下方法:
  Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。Fleek和Pinata允许您从 Web 浏览器上传文件:
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。
  第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave)访问托管在 IPFS 上的内容。Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  ENS 和 IPFS 是网络的未来吗?
  有各种各样的大缺点:
  我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。撇开缺点不谈,我相信 IPFS 和 ENS 有希望:
  Web3 对开发者意味着什么?
  如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。— Dries Buytaert
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。
  就好比以太坊和以太币一样。任何试图把IPFS和Filecoin分开,或者说独立无关者,要么是对项目的无知,就是混淆视听,另有所图,有着不可告人的目的。
  你的选择,决定你的未来!你选择相信什么,相信谁,就会给你什么样的答案!一切取决于你! 查看全部

  c 抓取网页数据 关注:“即使断网
  知名CMS系统网站搭建商创始人构建第一个Web3.0网站 更喜欢IPFS API而不是亚马逊专有API
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。
  CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  近日,
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth.两者都是ENS 域名。ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD.eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。因此,如果您拥有DNS,则可以使用ENS Domains 网站为.
  第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。从理论上讲,IPFS比传统的网站托管更具弹性。由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  (1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。
  运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。我找到了十几个固定服务,并尝试了以下方法:
  Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。Fleek和Pinata允许您从 Web 浏览器上传文件:
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。
  第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave)访问托管在 IPFS 上的内容。Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  ENS 和 IPFS 是网络的未来吗?
  有各种各样的大缺点:
  我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。撇开缺点不谈,我相信 IPFS 和 ENS 有希望:
  Web3 对开发者意味着什么?
  如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。— Dries Buytaert
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。
  就好比以太坊和以太币一样。任何试图把IPFS和Filecoin分开,或者说独立无关者,要么是对项目的无知,就是混淆视听,另有所图,有着不可告人的目的。
  你的选择,决定你的未来!你选择相信什么,相信谁,就会给你什么样的答案!一切取决于你!

用Python抓取在Github上的组织名称

网站优化优采云 发表了文章 • 0 个评论 • 33 次浏览 • 2022-06-20 13:36 • 来自相关话题

  用Python抓取在Github上的组织名称
  翻译:老齐
  与本文相关书籍推荐:《跟老齐学Python:Django实战》
  
  我想在我的个人网站上展现我在Github上提交代码的组织名称,并且不用我手动更新提交记录的变化。Github提供了读取数据的API,但是,不能体现出我想一些开发组织提交的代码。这就是我之所以要爬取那些信息的原因。本文的代码仓库:
  本文中,我将向你展示一下开发过程。
  准备
  为了能顺利完成本文项目,请安装如下依赖。在当前目录中创建一个名为requirements.txt的文件,打开文本编辑器,把下面的内容复制到该文件中。
  beautifulsoup4==4.9.0<br />lxml==4.5.0<br />requests==2.23.0<br />
  我们使用requests获取网页内容,lxml和beautifulsoup4是另外提取信息的工具。
  如果你不想把你本地的Python环境搞得太复杂,可以创建虚拟环境:
  $ python -m venv .venv<br />$ source .venv/bin/activate<br />
  然后,用pip安装requirements.txt里列出的各项依赖。
  $ python -m pip install -r requirements.txt<br />
  从HTML中找到相应的标签
  首先,你要知道从哪里找到需要的信息。在本例中,我打算获取用户向Github某个特定组织的提交记录,打开用户自己Github页面,滚动如下图所示的地方。
  
  在你的浏览器上用开发和工具,打开HTML源码,并且找到对应的元素。点击某个组织,对应着看到相应源码,在标签内的元素中的就是组织名称。
  我们感兴趣的就在元素里面,所以,要把这个元素的class记录下来,以备后用。
  orgs_nav_classes = "subnav mb-2 d-flex flex-wrap"<br />
  你可能注意到,我忽略了其他的组织名称,后面会演示,那些组织都包含在了我们提取的信息中了。另外,我们使用这个页面上抓取数据,因为HTML代码更可靠,所有的orgs_nav_classes值都一样。
  在工作目录中,创建scrape_github_orgs.py文件,其代码如下:
  # scrape_github_orgs.py<br /><br />import requests<br /><br />from bs4 import BeautifulSoup<br />from bs4.element import ResultSet<br /><br />orgs_nav_classes = "subnav mb-2 d-flex flex-wrap"<br /><br />def get_user_org_hyperlinks(username: str) -> ResultSet:<br /> url = f"https://github.com/users/{username}/contributions"<br /> page = requests.get(url)<br /> soup = BeautifulSoup(page.content, "html.parser")<br /><br /> nav = soup.find("nav", class_=orgs_nav_classes)<br /> tmp_orgs = nav.find_all("a")<br /><br /> return tmp_orgs<br /><br />print(get_user_org_hyperlinks("DahlitzFlorian"))<br />
  首先,引入需要的requests库,还有bs4中的BeautifulSoup。然后,定义函数get_user_org_hyperlinks(),它的参数是username,返回元素的值是 orgs_nav_classes的所有内容。最后一行,调用get_user_org_hyperlinks()函数,并且把结果打印出来。
  执行脚本,得到如下信息:
  $ python scrape-github-orgs.py<br />[<br /><br /> @python<br />, <br /><br /> @deadsnakes<br />, <br /><br /> @realpython<br />, <br /><br />@PyCQA<br />]<br />
  下面进入信息提取阶段。
  提取必要的信息
  记住,我们想获得某个用户提交代码的Github上的组织名称,已经得到了包含组织名称的超链接,然而,其中有很多我们不需要的样式类和属性,接下来就要清除它们,利用lxm包(lxml.html.clean.Cleaner)中的Cleaner()实现这个操作。首先,移除比必要的属性,为此创建一个Cleaner的实例,然后设置实例属性safe_attrs_only=True的值为True,与其关联的属性safe_attrs,利用frozenset创建一个不可变对象,并作为此属性的值。
  from lxml.html import clean<br /><br />cleaner = clean.Cleaner()<br />cleaner.safe_attrs_only = True<br />cleaner.safe_attrs = frozenset(["class", "src", "href", "target"])<br />
  上面的三行代码定义了cleaner对象,但是还没有对HTML采取行动,这要留作后用。接下来,我们要编写一个匹配所有HTML标签的正则表达式,因此要使用Python的re模块。
  import re<br /><br />html_tags = re.compile("")<br />
  最后,开始按照我们的需要实施清除操作。
<p>orgs = []<br /><br />for org in tmp_orgs:<br /> tmp_org = str(org)<br /> org_name = re.sub(<br /> html_tags,<br /> "",<br /> re.search(r" 查看全部

  用Python抓取在Github上的组织名称
  翻译:老齐
  与本文相关书籍推荐:《跟老齐学Python:Django实战》
  
  我想在我的个人网站上展现我在Github上提交代码的组织名称,并且不用我手动更新提交记录的变化。Github提供了读取数据的API,但是,不能体现出我想一些开发组织提交的代码。这就是我之所以要爬取那些信息的原因。本文的代码仓库:
  本文中,我将向你展示一下开发过程。
  准备
  为了能顺利完成本文项目,请安装如下依赖。在当前目录中创建一个名为requirements.txt的文件,打开文本编辑器,把下面的内容复制到该文件中。
  beautifulsoup4==4.9.0<br />lxml==4.5.0<br />requests==2.23.0<br />
  我们使用requests获取网页内容,lxml和beautifulsoup4是另外提取信息的工具。
  如果你不想把你本地的Python环境搞得太复杂,可以创建虚拟环境:
  $ python -m venv .venv<br />$ source .venv/bin/activate<br />
  然后,用pip安装requirements.txt里列出的各项依赖。
  $ python -m pip install -r requirements.txt<br />
  从HTML中找到相应的标签
  首先,你要知道从哪里找到需要的信息。在本例中,我打算获取用户向Github某个特定组织的提交记录,打开用户自己Github页面,滚动如下图所示的地方。
  
  在你的浏览器上用开发和工具,打开HTML源码,并且找到对应的元素。点击某个组织,对应着看到相应源码,在标签内的元素中的就是组织名称。
  我们感兴趣的就在元素里面,所以,要把这个元素的class记录下来,以备后用。
  orgs_nav_classes = "subnav mb-2 d-flex flex-wrap"<br />
  你可能注意到,我忽略了其他的组织名称,后面会演示,那些组织都包含在了我们提取的信息中了。另外,我们使用这个页面上抓取数据,因为HTML代码更可靠,所有的orgs_nav_classes值都一样。
  在工作目录中,创建scrape_github_orgs.py文件,其代码如下:
  # scrape_github_orgs.py<br /><br />import requests<br /><br />from bs4 import BeautifulSoup<br />from bs4.element import ResultSet<br /><br />orgs_nav_classes = "subnav mb-2 d-flex flex-wrap"<br /><br />def get_user_org_hyperlinks(username: str) -> ResultSet:<br /> url = f"https://github.com/users/{username}/contributions"<br /> page = requests.get(url)<br /> soup = BeautifulSoup(page.content, "html.parser")<br /><br /> nav = soup.find("nav", class_=orgs_nav_classes)<br /> tmp_orgs = nav.find_all("a")<br /><br /> return tmp_orgs<br /><br />print(get_user_org_hyperlinks("DahlitzFlorian"))<br />
  首先,引入需要的requests库,还有bs4中的BeautifulSoup。然后,定义函数get_user_org_hyperlinks(),它的参数是username,返回元素的值是 orgs_nav_classes的所有内容。最后一行,调用get_user_org_hyperlinks()函数,并且把结果打印出来。
  执行脚本,得到如下信息:
  $ python scrape-github-orgs.py<br />[<br /><br /> @python<br />, <br /><br /> @deadsnakes<br />, <br /><br /> @realpython<br />, <br /><br />@PyCQA<br />]<br />
  下面进入信息提取阶段。
  提取必要的信息
  记住,我们想获得某个用户提交代码的Github上的组织名称,已经得到了包含组织名称的超链接,然而,其中有很多我们不需要的样式类和属性,接下来就要清除它们,利用lxm包(lxml.html.clean.Cleaner)中的Cleaner()实现这个操作。首先,移除比必要的属性,为此创建一个Cleaner的实例,然后设置实例属性safe_attrs_only=True的值为True,与其关联的属性safe_attrs,利用frozenset创建一个不可变对象,并作为此属性的值。
  from lxml.html import clean<br /><br />cleaner = clean.Cleaner()<br />cleaner.safe_attrs_only = True<br />cleaner.safe_attrs = frozenset(["class", "src", "href", "target"])<br />
  上面的三行代码定义了cleaner对象,但是还没有对HTML采取行动,这要留作后用。接下来,我们要编写一个匹配所有HTML标签的正则表达式,因此要使用Python的re模块。
  import re<br /><br />html_tags = re.compile("")<br />
  最后,开始按照我们的需要实施清除操作。
<p>orgs = []<br /><br />for org in tmp_orgs:<br /> tmp_org = str(org)<br /> org_name = re.sub(<br /> html_tags,<br /> "",<br /> re.search(r"

用chardect库解决网页乱码问题

网站优化优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2022-06-18 12:20 • 来自相关话题

  用chardect库解决网页乱码问题
  写爬虫时经常对网址发起请求,结果返回的html数据除了标签能看懂,其他的全部是乱码。大家如果对爬虫感兴趣,请耐心阅读本文,我们就以百度风雨榜爬虫为例学习下乱码处理问题。
  http://top.baidu.com/buzz?b=1
  
  
  百度风云榜一共有50个关键词,我们先任选其中一个打开看看。
  一、实验目的
  我们的目的是学会使用chardect库,对乱码内容进行处理。本文会以一个具体的例子,通过实战的方式获取正确编码的数据。
  二、代码实战2.1 定位关键词及其链接
  F12键盘打开开发者工具,我们定位关键词及其对应的html标签。在这里我们使用pyquery库定位 class属性为'keyword'的td。
  #百度风云榜页面网址(含有50个热门新闻的关键词)<br />fengyunbang_url = 'http://top.baidu.com/buzz?b=1'<br /><br />resp = requests.get(fengyunbang_url)<br /><br />#从html文件中解析出  事件字段和 网址字段<br />doc = PyQuery(resp.text)<br />for item in doc.items('.keyword'):
   keyword = item('a').text().split(' ')[0]<br />
   keyword_link=item('a').attr.href    <br />    print(keyword,keyword_link)
  运行,结果keyword全部为乱码,没有一点中文的痕迹。
  这就是我们今天要克服的问题-html编码问题。
  遇到这种问题问题,我们可能会先在html标签中查找charset字符集。一般charset值有utf-8、gbk、gb2312、ascii等。
  再次运行,汉字正常显示。
  2.2 定位搜索页面新闻链接
  上面我们获取到了关键词及其链接,浏览器点击“46年吃3万个汉堡”对应的链接,跳转到 百度搜索页,如下图。
  我们想获取新闻内容,而要获取新闻内容,我们就要知道新闻对应的链接。首先我们要定位,如下图。这里我们使用另外一种方式定位链接-正则表达式。
  def get_keywords_news_links(keyword_link):
   """
   访问关键词百度网址,得到相关新闻的link
   :param keyword_link:
   :return:
   """
   headers = {'User-Agent': '你的user-agent'}
   
   resp = requests.get(keyword_link, headers=headers)<br />
   bsObj = BeautifulSoup(resp.text, 'html.parser')<br />
   news_items = bsObj.find_all('div', {'class': 'result c-container '})
   
   news_links = []
   for item in news_items:<br />
       links = re.findall('href="(.*?)"', str(item))<br />
       news_links.extend(links)
   
   #防止链接重复
   news_links = set(news_links)
   return news_links
  但是后来发现有的链接是无法访问的,比如运行中居然抽取出含有***这种的网页,经过测试,只要剔除掉这种链接,剩下的都为有效链接。
  2.3 获取新闻文本内容
  有了上文获取到的链接,我们写个简单的代码获取文本内容。由于获取到的网址来源成百上千的网站,如果要精确获取新闻内容,需要对每一个网站一对一的进行定位。这样太麻烦,为了快速方便,我们使用正则匹配出所有的中文内容。
  def get_news_content(link):
   """
   根据新闻网址,获取新闻数据
   :return:  新闻内容
   """
   resp = requests.get(link)
   #最终只有汉字保留。
   news_text = ''.join(re.findall('[\u4e00-\u9fa5]+', resp.text))<br />
   return news_text
  但是运行过程中,经常返回空。说明正则匹配中文时候匹配不到。很可能的原因是页面中没有中文,但是我们检测了这些页面都是有中文的,那么很有可能是因为页面乱码,导致正则[\u4e00-\u9fa5]+无法匹配到中文。经过检测,真的是乱码。解决办法resp.encoding='编码'。但是编码是什么值呢?这里我用新的方法,chardect库检测二进制数据中采用的编码方式。
  def get_news_content(link):
   """
   根据新闻网址,获取新闻数据
   :return:  新闻内容
   """
   resp = requests.get(link)
   news_text = ''.join(re.findall('[\u4e00-\u9fa5]+',
   resp.text))
   
   #网页乱码,导致news_text为空
   if not news_text:
       #根据二进制数据检测html的编码。resp.content获取html二进制数据
       encoding = resp.content['encoding']
       chaset = chardet.detect(encoding)
       #解决编码问题
       resp.encoding = chaset
       news_text = ''.join(re.findall('[\u4e00-\u9fa5]+', resp.text))
       <br />        return news_text    <br />    return news_text
  2.4 编写爬虫主函数
  编写爬虫主函数,将数据保存到csv中。
  #主函数,访问并保存所有的新闻数据<br />def FetchAndSave():
   #百度风云榜页面网址(含有50个热门新闻的关键词)
   fengyunbang_url = 'http://top.baidu.com/buzz?b=1'
   resp = requests.get(fengyunbang_url)
   resp.encoding='gb2312'
   #新建excel文件保存数据。
   csvf = open('data.csv', 'a+', encoding='gbk', newline='') as csvf
                           
   writer = csv.writer(csvf)
   writer.writerow(('news_content', 'keyword'))
   #从heml文件中解析出  事件字段和 网址字段
   doc = PyQuery(resp.text)
   for item in doc.items('.keyword'):
       keyword = item('a').text().split(' ')[0]<br />
       keyword_link = item('a').attr.href
       news_links = get_keywords_news_links(keyword_link)<br />
       for news_link in news_links:
           try:
               content = get_news_content(news_link)
               #防止空内容写入csv中
               if content:
                   writer.writerow((content, keyword))
           except:
               print(news_link)<br /><br /><br />#运行爬虫<br />FetchAndSave()
  运行爬虫,采集了50个关键词共388篇新闻内容。
  
  有问题,问大邓
  项目代码链接: 密码: sqfb
  往期文章 查看全部

  用chardect库解决网页乱码问题
  写爬虫时经常对网址发起请求,结果返回的html数据除了标签能看懂,其他的全部是乱码。大家如果对爬虫感兴趣,请耐心阅读本文,我们就以百度风雨榜爬虫为例学习下乱码处理问题。
  http://top.baidu.com/buzz?b=1
  
  
  百度风云榜一共有50个关键词,我们先任选其中一个打开看看。
  一、实验目的
  我们的目的是学会使用chardect库,对乱码内容进行处理。本文会以一个具体的例子,通过实战的方式获取正确编码的数据。
  二、代码实战2.1 定位关键词及其链接
  F12键盘打开开发者工具,我们定位关键词及其对应的html标签。在这里我们使用pyquery库定位 class属性为'keyword'的td。
  #百度风云榜页面网址(含有50个热门新闻的关键词)<br />fengyunbang_url = 'http://top.baidu.com/buzz?b=1'<br /><br />resp = requests.get(fengyunbang_url)<br /><br />#从html文件中解析出  事件字段和 网址字段<br />doc = PyQuery(resp.text)<br />for item in doc.items('.keyword'):
   keyword = item('a').text().split(' ')[0]<br />
   keyword_link=item('a').attr.href    <br />    print(keyword,keyword_link)
  运行,结果keyword全部为乱码,没有一点中文的痕迹。
  这就是我们今天要克服的问题-html编码问题。
  遇到这种问题问题,我们可能会先在html标签中查找charset字符集。一般charset值有utf-8、gbk、gb2312、ascii等。
  再次运行,汉字正常显示。
  2.2 定位搜索页面新闻链接
  上面我们获取到了关键词及其链接,浏览器点击“46年吃3万个汉堡”对应的链接,跳转到 百度搜索页,如下图。
  我们想获取新闻内容,而要获取新闻内容,我们就要知道新闻对应的链接。首先我们要定位,如下图。这里我们使用另外一种方式定位链接-正则表达式。
  def get_keywords_news_links(keyword_link):
   """
   访问关键词百度网址,得到相关新闻的link
   :param keyword_link:
   :return:
   """
   headers = {'User-Agent': '你的user-agent'}
   
   resp = requests.get(keyword_link, headers=headers)<br />
   bsObj = BeautifulSoup(resp.text, 'html.parser')<br />
   news_items = bsObj.find_all('div', {'class': 'result c-container '})
   
   news_links = []
   for item in news_items:<br />
       links = re.findall('href="(.*?)"', str(item))<br />
       news_links.extend(links)
   
   #防止链接重复
   news_links = set(news_links)
   return news_links
  但是后来发现有的链接是无法访问的,比如运行中居然抽取出含有***这种的网页,经过测试,只要剔除掉这种链接,剩下的都为有效链接。
  2.3 获取新闻文本内容
  有了上文获取到的链接,我们写个简单的代码获取文本内容。由于获取到的网址来源成百上千的网站,如果要精确获取新闻内容,需要对每一个网站一对一的进行定位。这样太麻烦,为了快速方便,我们使用正则匹配出所有的中文内容。
  def get_news_content(link):
   """
   根据新闻网址,获取新闻数据
   :return:  新闻内容
   """
   resp = requests.get(link)
   #最终只有汉字保留。
   news_text = ''.join(re.findall('[\u4e00-\u9fa5]+', resp.text))<br />
   return news_text
  但是运行过程中,经常返回空。说明正则匹配中文时候匹配不到。很可能的原因是页面中没有中文,但是我们检测了这些页面都是有中文的,那么很有可能是因为页面乱码,导致正则[\u4e00-\u9fa5]+无法匹配到中文。经过检测,真的是乱码。解决办法resp.encoding='编码'。但是编码是什么值呢?这里我用新的方法,chardect库检测二进制数据中采用的编码方式。
  def get_news_content(link):
   """
   根据新闻网址,获取新闻数据
   :return:  新闻内容
   """
   resp = requests.get(link)
   news_text = ''.join(re.findall('[\u4e00-\u9fa5]+',
   resp.text))
   
   #网页乱码,导致news_text为空
   if not news_text:
       #根据二进制数据检测html的编码。resp.content获取html二进制数据
       encoding = resp.content['encoding']
       chaset = chardet.detect(encoding)
       #解决编码问题
       resp.encoding = chaset
       news_text = ''.join(re.findall('[\u4e00-\u9fa5]+', resp.text))
       <br />        return news_text    <br />    return news_text
  2.4 编写爬虫主函数
  编写爬虫主函数,将数据保存到csv中。
  #主函数,访问并保存所有的新闻数据<br />def FetchAndSave():
   #百度风云榜页面网址(含有50个热门新闻的关键词)
   fengyunbang_url = 'http://top.baidu.com/buzz?b=1'
   resp = requests.get(fengyunbang_url)
   resp.encoding='gb2312'
   #新建excel文件保存数据。
   csvf = open('data.csv', 'a+', encoding='gbk', newline='') as csvf
                           
   writer = csv.writer(csvf)
   writer.writerow(('news_content', 'keyword'))
   #从heml文件中解析出  事件字段和 网址字段
   doc = PyQuery(resp.text)
   for item in doc.items('.keyword'):
       keyword = item('a').text().split(' ')[0]<br />
       keyword_link = item('a').attr.href
       news_links = get_keywords_news_links(keyword_link)<br />
       for news_link in news_links:
           try:
               content = get_news_content(news_link)
               #防止空内容写入csv中
               if content:
                   writer.writerow((content, keyword))
           except:
               print(news_link)<br /><br /><br />#运行爬虫<br />FetchAndSave()
  运行爬虫,采集了50个关键词共388篇新闻内容。
  
  有问题,问大邓
  项目代码链接: 密码: sqfb
  往期文章

c 抓取网页数据 关注:“即使断网

网站优化优采云 发表了文章 • 0 个评论 • 46 次浏览 • 2022-06-18 12:18 • 来自相关话题

  c 抓取网页数据 关注:“即使断网
  知名CMS系统网站搭建商创始人构建第一个Web3.0网站 更喜欢IPFS API而不是亚马逊专有API
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。
  CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  
  近日,
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth.两者都是ENS 域名。ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD.eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。因此,如果您拥有DNS,则可以使用ENS Domains 网站为.
  第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。从理论上讲,IPFS比传统的网站托管更具弹性。由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  (1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。
  运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  
  
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。我找到了十几个固定服务,并尝试了以下方法:
  Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。Fleek和Pinata允许您从 Web 浏览器上传文件:
  
  
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。
  第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave)访问托管在 IPFS 上的内容。Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  
  ENS 和 IPFS 是网络的未来吗?
  有各种各样的大缺点:
  我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。撇开缺点不谈,我相信 IPFS 和 ENS 有希望:
  Web3 对开发者意味着什么?
  如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。— Dries Buytaert
  
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。
  就好比以太坊和以太币一样。任何试图把IPFS和Filecoin分开,或者说独立无关者,要么是对项目的无知,就是混淆视听,另有所图,有着不可告人的目的。
  你的选择,决定你的未来!你选择相信什么,相信谁,就会给你什么样的答案!一切取决于你! 查看全部

  c 抓取网页数据 关注:“即使断网
  知名CMS系统网站搭建商创始人构建第一个Web3.0网站 更喜欢IPFS API而不是亚马逊专有API
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。
  CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  
  近日,
  全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth.两者都是ENS 域名。ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD.eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。因此,如果您拥有DNS,则可以使用ENS Domains 网站为.
  第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。从理论上讲,IPFS比传统的网站托管更具弹性。由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  (1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。
  运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  
  
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。我找到了十几个固定服务,并尝试了以下方法:
  Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。Fleek和Pinata允许您从 Web 浏览器上传文件:
  
  
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。
  第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave)访问托管在 IPFS 上的内容。Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  
  ENS 和 IPFS 是网络的未来吗?
  有各种各样的大缺点:
  我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。撇开缺点不谈,我相信 IPFS 和 ENS 有希望:
  Web3 对开发者意味着什么?
  如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。— Dries Buytaert
  
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。
  Web3 的承诺是什么?
  我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。
  就好比以太坊和以太币一样。任何试图把IPFS和Filecoin分开,或者说独立无关者,要么是对项目的无知,就是混淆视听,另有所图,有着不可告人的目的。
  你的选择,决定你的未来!你选择相信什么,相信谁,就会给你什么样的答案!一切取决于你!

c 抓取网页数据 “即使断网

网站优化优采云 发表了文章 • 0 个评论 • 51 次浏览 • 2022-06-18 12:12 • 来自相关话题

  c 抓取网页数据 “即使断网
  Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  
  近日,全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth.两者都是ENS 域名。ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD.eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。因此,如果您拥有DNS,则可以使用ENS Domains 网站为.第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。从理论上讲,IPFS比传统的网站托管更具弹性。
  由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  (1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  
  
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。我找到了十几个固定服务,并尝试了以下方法:Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。Fleek和Pinata允许您从 Web 浏览器上传文件:
  
  
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave)访问托管在 IPFS 上的内容。Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  
  ENS 和 IPFS 是网络的未来吗?有各种各样的大缺点:我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。撇开缺点不谈,我相信 IPFS 和 ENS 有希望:Web3 对开发者意味着什么?如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。Web3 的承诺是什么?我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。— Dries Buytaert
  
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。 查看全部

  c 抓取网页数据 “即使断网
  Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站
  “即使我的笔记本电脑与互联网断开连接,我的网页仍然可用”
  
  对于国内很多互联网从业者来说,CMS是再熟悉不过的建站程序了,自从有了CMS后,改变了过去网站搭建需要完全手动敲代码的尴尬,毋须四处去找免费的建站程序,从而也避免了被代码后门木马一类的攻击的威胁。CMS是content management system的英文缩写,即内容管理系统,是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。
  内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。
  内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  内容抓取工具国内比较熟悉的有优采云,小蜜蜂采集器,让没有时间打理自己网站的个人站长免去了需要繁杂的从其他网站复制粘贴内容的劳烦。
  
  近日,全球知名的CMS系统Drupal创始人发布文章称自己利用IPFS和ENS构建了第一个Web3.0网站,
  
  原文如下:
  今天,我将使用 web3 技术发布我的第一个网页。我将上传一个页面到 IPFS(星际文件系统),dries.eth使用 ENS(以太坊名称服务)使其可用,并使用支持 web3 的浏览器访问它。
  如果您不知道这意味着什么,请准备好参加速成课程。
  第1步:购买 ENS 域名
  去年,我铸造buytaert.eth了.,最近,我购买了dries.eth.两者都是ENS 域名。ENS代表以太坊名称服务,是一种基于开源区块链的命名协议。
  您可以将 ENS 视为 web3 的 DNS。DNS 将域名映射到 IP 地址,ENS 将域名映射到以太坊地址。以太坊地址可以指向加密货币钱包、内容哈希等。ENS 不仅仅是以太坊的服务;它是使用智能合约在以太坊上构建的通用 web3 服务。因为 ENS 是建立在区块链之上的,所以它比 DNS 更能抵抗审查。今天,拥有自己的 ENS 域的主要用例是使接收加密货币更容易。如果你想给我寄一些以太币,你必须把它0xbAD65DE65AE2c23f5eA30d12fC8c2f883cbe671f寄到我的以太坊钱包的地址。因为我拥有dries.eth,所以您可以发送它dries.eth。更容易记住!dries.eth无需任何中间人就可以从世界任何地方的任何人那里未经许可地收集加密货币,这真是太神奇了。但是,这不是今天博客文章的主题。在这篇博文中,我想展示如何dries.eth使用它来托管一个完全去中心化的 web3 网页。如果您想购买.eth域名,可以在ENS 域名网站上购买。由于.eth域名是 NFT(非同质代币),您还可以在OpenSea等 NFT 市场买卖域名。ENS 于 2017 年 5 月推出时,它仅支持 ENS 原生 TLD.eth。自 2021 年 8 月起,ENS 增加了对完整 DNS 命名空间的支持。因此,如果您拥有DNS,则可以使用ENS Domains 网站为.第 2 步:将 HTML 文件上传到 IPFS
  IPFS是InterPlanetary File System的缩写,是一种用于存储和共享数据的开源协议和点对点网络。如今,大多数网页都存储在单个服务器上,托管在单个数据中心中。这些站点对单点故障、拒绝服务攻击或政府审查的弹性不大。更高级的网站使用CDN和其他缓存系统复制他们的网页。我的网站使用多个 Kubernetes Web 节点,Varnish 和 Cloudflare,但那是因为我的公司帮助运行了世界上一些最大的网站,而不是因为我的网站需要它。所有这些技术都可以用来提高网站的弹性。使用 IPFS,您的网页可以在全球数百个“IPFS 节点”上复制。世界上每个人都可以运行一个 IPFS 节点。节点创建一个单一的全球网络,网络中的每个文件都有一个唯一的全球标识符。从理论上讲,IPFS比传统的网站托管更具弹性。
  由于 IPFS 节点由世界各地不同的人和组织运行,并且内容在它们之间复制,因此托管的内容更能抵抗单点故障、拒绝服务攻击或政府审查。另一方面,缓和错误信息也更加困难。我之所以写“理论上”是因为上传到 IPFS 的内容只有在世界某个地方的一个节点选择托管它时才保持可用。
  默认情况下,IPFS 不包含用于激励网络中其他节点复制数据的内置机制。每个 IPFS 节点都倾向于托管自己的数据。其他节点可以合作复制数据,也可以作为服务复制数据。这就是Filecoin的用武之地。与 IPFS 一样,Filecoin 是一个开源协议。
  IPFS 本身不是基于区块链的,但 Filecoin 是。Filecoin 通过一个用于存储和复制数据的公共市场扩展了 IPFS。
  矿工可以赚取Filecoin(一种加密货币代币)以换取存储和复制 IPFS 数据。因为 Filecoin 是基于区块链的,所以市场不属于单一中介。存储交易由网络上的节点以编程方式进行代理。长话短说,要在 IPFS 上托管我的网页,我需要至少一个 IPFS 节点愿意托管我的内容。
  有两种解决方案:
  (1)我可以运行我自己的 IPFS 节点或(2)我可以支付第三方 IPFS 服务来托管我的内容。运行我自己的 IPFS 节点
  本着帮助构建去中心化网络的精神,运行自己的 IPFS 节点应该是首选。您可以在下面看到我的本地 IPFS 节点托管我的index.html文件:
  
  
  因为我的本地 IPFS 节点在我的笔记本电脑上运行,所以我的网页只有在我的笔记本电脑连接到互联网时才可用。如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  有几个朋友在 IPFS 上钉住彼此的网站,您不再需要为虚拟主机付费!
  第三方 IPFS 和 pinning 服务
  如果您不想运行自己的 IPFS 服务,或者您没有可以复制您的数据的朋友,您可以使用第三方 IPFS 和 pinning 服务。我找到了十几个固定服务,并尝试了以下方法:Infura使用其命令行工具可以轻松上传文件:
  $ ipfs-upload-client --id xxx --secret yyy ./index.html
  xxx是 Infura 项目 ID 和yyyInfura 项目密钥。Fleek和Pinata允许您从 Web 浏览器上传文件:
  
  
  如果您正在寻找基于 Filecoin 的解决方案,推荐使用web3.storage和estuary.tech。第 3 步:访问您的 web3 网页
  将文件上传到 IPFS 后,您将获得文件的“哈希”(唯一 ID 或地址)。index.html我的文件的哈希是:bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q可以使用与 IPFS 兼容的浏览器(例如Brave)访问托管在 IPFS 上的内容。Firefox、Safari 和 Chrome 目前不原生支持 IPFS,但存在各种 IPFS 浏览器扩展。使用 Brave,您可以访问我的网页ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q(注意ipfs://架构)。
  
  第 4 步:将您的网页映射到您的域名
  能够访问您的 IPFS 托管网站非常简洁,但您可能不会要求其他人在 ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q 上查看您的新网页。使用 60 个字符的十六进制散列并不完全理想。这就是 ENS 的用武之地。我只需将Content Resolver记录设置dries.eth为与我的网页关联的 IPFS 哈希。
  
  更新 ENS 记录会永久更新以太坊区块链的状态。
  这意味着您必须支付“汽油费”或网络交易费。
  正如你在Etherscan上看到的,更新我的 ENS 记录花了我0.004369 以太币(当时 11.69 美元)。
  您现在可以使用 ENS 和 IPFS 兼容的浏览器访问。瞧,一个真正去中心化的网站!
  
  ENS 和 IPFS 是网络的未来吗?有各种各样的大缺点:我相信这些缺点将在未来几年得到解决。有些人可能已经有了解决方案。撇开缺点不谈,我相信 IPFS 和 ENS 有希望:Web3 对开发者意味着什么?如果您是开发人员,请将 web3 视为不断增长的新“Web 服务”集合。IPFS 和 ENS 就是两个这样的 Web 服务。
  今天,它们主要提供改进的弹性和审查保护。
  如果弹性和审查保护对您的网站很重要,请使用它们。
  如果不是,您不必使用它们。
  作为的所有者和开发者,我不关心审查保护。出于这个原因,我很高兴继续使用传统的托管技术。
  但我确实认识到 IPFS 和 ENS 在未来可能会变得更有趣。在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。Web3 的承诺是什么?我确实认为观看 web3 空间很重要。
  新的强大的 web3 服务将会出现。
  互联网消除中间体的愿望已经持续了 20 多年,这是一个不可阻挡的趋势。
  使用 web3,更多的中介机构面临去中介化和去中心化的风险。这包括其商业模式依赖于专有数据库和分类账的组织;金融机构、中央银行、某些非营利组织、社会团体。其中许多可以变成真正去中心化的网络服务。例如,许多商业网站使用 PayPal 或 Square 等中介提供贷款和贷款偿还计划。随着时间的推移,其中一些中介机构可能会被无需许可的分布式网络服务所取代,这些服务收取的利息和/或交易费用较低。
  想象一下有一天,商业网站无需中介即可直接向客户提供贷款偿还计划变得非常容易。当利润率受益时,技术解决方案就会迅速被采用。区块链还将使我们能够以新的方式解决协调和所有权问题。
  在网络上创建内容(图像、音乐、视频、博客文章)的每个人都可以从中受益。其他人使用您的内容并以编程方式将价值流回您的能力非常令人兴奋。最重要的是,我希望这些去中心化服务能够帮助我们推进公共产品的管理方式、我们维持开源项目的方式,以及我们如何能够有意义地将权力从大型组织转移到个人和社区。但这是未来博客文章的主题。— Dries Buytaert
  
  Dries Buytaert 是 Drupal 开源 Web 发布和协作平台的原始创建者和项目负责人。
  Buytaert 担任 Drupal 协会主席,该协会是一个旨在帮助 Drupal 蓬勃发展的非营利组织。
  他还是 Acquia 的联合创始人兼首席技术官,Acquia 是一家风险投资支持的软件公司,为 Drupal 提供产品和服务。Dries 还是 Mollom 的联合创始人,Mollom 是一种网络服务,可以帮助您识别内容质量,更重要的是,可以帮助您阻止网站垃圾邮件。Buytaert 出生于比利时,拥有根特大学计算机科学与工程博士学位和安特卫普大学计算机科学 (MSC) 学位。2008 年,Buytaert 被《商业周刊》评为科技青年企业家以及 MIT TR 35 Young Innovator。2011 年,《福布斯》将 Acquia 评为最有前途的 100 家公司之一。2012 年,Inc 宣布 Acquia 是美国发展最快的私人软件公司。
  
  重点:
  如前所述,我可以使用 Filecoin 支付网络上的其他节点来复制我的内容。
  但是,我想出了一个更好的解决方案:我最好的朋友之一。我让他将我的文件“固定”在他的一些永久连接到互联网的 IPFS 节点上。
  这样,即使我的笔记本电脑与互联网断开连接,我的网页仍然可用。
  在目前的状态下,IPFS 和 ENS 对大多数网站所有者的价值有限,但对所有网站所有者的一小部分来说价值巨大。这在未来可能会改变。评:
  如何使用IPFS和Filecoin配合起来进行网站的搭建,这次给出了具体答案,最大的一点就是即使跟目前的互联网断开,依旧可以访问,这在实践上证实了IPFS和Filecoin的巨大价值,对于弥补或取代Http传统互联网天然弊端产生很大的影响。
  Filecoin是IPFS唯一的激励层,在操作中是相互关联和配合使用的。
  包括搭建网站在内的很多功能实现,虽然在目前还需要不断探索和改进,相信在全球社区和开发人员不断努力下,会开发出更多的应用工具,在不久未来会得到更好的使用体验,并得到更多的使用。
  IPFS和Filecoin是相辅相成,互相配合,相互关联,IPFS需要Filecoin激励来存储更多数据,从而让更多的人参与进来,把数据传输网络壮大;同时,Filecoin也需要IPFS的底层传输技术把网络变得有价值。

初学指南| 用Python进行网页抓取

网站优化优采云 发表了文章 • 0 个评论 • 37 次浏览 • 2022-06-17 15:22 • 来自相关话题

  初学指南| 用Python进行网页抓取
  
  关于转载授权
  大数据文摘作品,欢迎个人转发朋友圈,自媒体、媒体、机构转载务必申请授权,后台留言“机构名称+转载”,申请过授权的不必再次申请,只要按约定转载即可,但文末需放置大数据文摘二维码。
  编译|丁雪 黄念程序注释|席雄芬校对|姚佳灵
  引言
  从网页中提取信息的需求日益剧增,其重要性也越来越明显。每隔几周,我自己就想要到网页上提取一些信息。比如上周我们考虑建立一个有关各种数据科学在线课程的欢迎程度和意见的索引。我们不仅需要找出新的课程,还要抓取对课程的评论,对它们进行总结后建立一些衡量指标。这是一个问题或产品,其功效更多地取决于网页抓取和信息提取(数据集)的技术,而非以往我们使用的数据汇总技术。
  网页信息提取的方式
  从网页中提取信息有一些方法。使用API可能被认为是从网站提取信息的最佳方法。几乎所有的大型网站,像Twitter、Facebook、Google、Twitter、StackOverflow都提供API以更为结构化的方式访问该网站的数据。如果可以直接通过API得到所需要的信息,那么这个方法几乎总是优于网页抓取方法。因为如果可以从数据提供方得到结构化的数据,为什么还要自己建立一个引擎来提取同样的数据?
  不幸的是,并不是所有的网站都提供API。一些网站是不愿意让读者通过结构化的方式抓取大量的信息,另一些网站是因为缺乏相关的技术知识而不能提供API。在这样的情况下,该怎么做?好吧,我们需要通过网页抓取来获得数据。
  当然还有一些像RSS订阅等的其它方式,但是由于使用上的限制,因此我将不在这里讨论它们。
  
  什么是网页抓取?
  网页抓取是一种从网站中获取信息的计算机软件技术。这种技术主要聚焦于把网络中的非结构化数据(HTML 格式)转变成结构化数据(数据库或电子表格)。
  可以用不同的方式实施网页抓取,包括从Google Docs到几乎所有的编程语言。由于Python的易用性和丰富的生态系统,我会选择使用Python。Python中的BeautifulSoup库可以协助完成这一任务。在本文中,我将会利用Python编程语言给你看学习网页抓取最简单的方式。
  对于需要借助非编程方式提取网页数据的读者,可以去import.io上看看。那上面有基于图形用户界面的驱动来运行网页抓取的基础操作,计算机迷们可以继续看本文!
  网页抓取所需要的库
  我们都知道Python是一门开源编程语言。你也许能找到很多库来实施一个功能。因此,找出最好的库是非常必要的。我倾向于使用BeautifulSoup (Python库),因为它的使用简单直观。准确地说,我会用到两个Python模块来抓取数据:
  •Urllib2:它是一个Python模块,用来获取URL。它定义函数和类,实现URL操作(基本、摘要式身份验证、重定向、cookies等)欲了解更多详情,请参阅文档页面。
  •BeautifulSoup:它是一个神奇的工具,用来从网页中提取信息。可以用它从网页中提取表格、列表、段落,也可以加上过滤器。在本文中,我们将会用最新版本,BeautifulSoup 4。可以在它的文档页面查看安装指南。
  BeautifulSoup不帮我们获取网页,这是我将urllib2和BeautifulSoup 库一起使用的原因。除了BeautifulSoup之外,Python还有其它一些方法用于HTML的抓取。如:
  •mechanize
  •scrapemark
  •scrapy
  基础-熟悉HTML(标签)
  在进行网页抓取时,我们需要处理html标签。因此,我们必须先好好理解一下标签。如果已经了解HTML的基础知识,可以跳过这一节。以下是HTML的基本语法:
  
  该语法的各种标签的解释如下:
  1.:html文档必须以类型声明开始
  2.html文档写在 和标签之间
  3.html文档的可见部分写在 和标签之间
  4.html头使用 到 标签定义
  5.html段落使用
  标签定义
  其它有用的HTML标签是:
  1.html链接使用标签定义,“这是一个测试链接.com”
  2.html表格使用定义,行用表示,行用分为数据
  
  3.html列表以(无序)和(有序)开始,列表中的每个元素以开始
  如果不熟悉这些HTML标签,我建议到W3schools上学习HTML教程。这样对HTML标签会有个清楚的理解。
  使用BeautifulSoup抓取网页
  在这里,我将从维基百科页面上抓取数据。我们的最终目的是抓取印度的邦、联邦首府的列表,以及一些基本细节,如成立信息、前首府和其它组成这个维基百科页面的信息。让我们一步一步做这个项目来学习:
  1.导入必要的库
  2.使用“prettify”函数来看HTML页面的嵌套结构
  
  如上所示,可以看到HTML标签的结构。这将有助于了解不同的可用标签,从而明白如何使用它们来抓取信息。
  3.处理HTML标签
  a.soup.:返回在开始和结束标签之间的内容,包括标签在内。
  
  
  b.soup..string: 返回给定标签内的字符串
  
  c.找出在标签内的链接:我们知道,我们可以用标签标记一个链接。因此,我们应该利用soup.a 选项,它应该返回在网页内可用的链接。我们来做一下。
  
  如上所示,可以看到只有一个结果。现在,我们将使用“find_all()”来抓取中的所有链接。
  上面显示了所有的链接,包括标题、链接和其它信息。现在,为了只显示链接,我们需要使用get的“href”属性:遍历每一个标签,然后再返回链接。
  
  4.找到正确的表:当我们在找一个表以抓取邦首府的信息时,我们应该首先找出正确的表。让我们写指令来抓取所有表标签中的信息。
  
  现在为了找出正确的表,我们将使用表的属性“class(类)”,并用它来筛选出正确的表。在chrome浏览器中,可以通过在所需的网页表格上单击右键来查询其类名–>检查元素–>复制该类名或通过上述命令的输出找到正确的表的类名。
  
  
  5.提取信息放入DataFrame:在这里,我们要遍历每一行(tr),然后将tr的每个元素(td)赋给一个变量,将它添加到列表中。让我们先看看表格的HTML结构(我不想抓取表格标题的信息)
  如上所示,你会注意到的第二个元素在< th >标签内,而不在标签内。因此,对这一点我们需要小心。现在要访问每个元素的值,我们会使用每个元素的“find(text=True)”选项。让我们看一下代码:
  
  
  
  
  最后,我们在dataframe内的数据如下:
  
  类似地,可以用BeautifulSoup实施各种其它类型的网页抓取。这将减轻从网页上手工收集数据的工作。也可以看下其它属性,如.parent,.contents,.descendants 和.next_sibling,.prev_sibling以及各种用于标签名称浏览的属性。这些将有助于您有效地抓取网页。
  但是,为什么我不能只使用正则表达式(Regular Expressions)?
  现在,如果知道正则表达式,你可能会认为可以用它来编写代码做同样的事情。当然,我也有过这个问题。我曾使用BeautifulSoup和正则表达式来做同样的事情,结果发现:
  BeautifulSoup里的代码比用正则表达式写的更强大。用正则表达式编写的代码得随着页面中的变动而进行更改。即使BeautifulSoup在一些情况下需要调整,但相对来讲,BeautifulSoup较好一些。
  正则表达式比BeautifulSoup快得多,对于相同的结果,正则表达式比BeautifulSoup快100倍。
  因此,它归结为速度与代码的鲁棒性之间的比较,这里没有万能的赢家。如果正在寻找的信息可以用简单的正则表达式语句抓取,那么应该选择使用它们。对于几乎所有复杂的工作,我通常更多地建议使用BeautifulSoup,而不是正则表达式。
  结语
  本文中,我们使用了Python的两个库BeautifulSoup和urllib2。我们也了解了HTML的基础知识,并通过解决一个问题,一步一步地实施网页抓取。我建议你练习一下并用它来从网页中搜集数据。
  译者简介丁雪华中师范大学情报学专业硕士,从事用户行为与个性化服务方向的研究。关注大数据的发展,欲从事互联网与咨询行业的相关工作。黄念上海长海医院在读硕士,对生物医药大数据挖掘的及其应用很感兴趣,愿意借助本平台认识更多的小伙伴。席雄芬北京邮电大学无线信号处理专业研究生在读,主要研究图信号处理,对基于社交网络的图数据挖掘感兴趣,希望借助此平台能认识更多的从事大数据方面的人,结交更多的志同道合者。姚佳灵家庭主妇,对数据分析和处理很感兴趣,正在努力学习中,希望能和大家多交流。
  
  【限时干货下载】
  2015/11/30前
  2015年10月干货文件打包下载,请点击大数据文摘底部菜单:下载等--10月下载
  大数据文摘精彩文章:
  回复【金融】 看【金融与商业】专栏历史期刊文章
  回复【可视化】感受技术与艺术的完美结合
  回复【安全】 关于泄密、黑客、攻防的新鲜案例
  回复【算法】 既涨知识又有趣的人和事
  回复【谷歌】 看其在大数据领域的举措
  回复【院士】 看众多院士如何讲大数据
  回复【隐私】 看看在大数据时代还有多少隐私
  回复【医疗】 查看医疗领域文章6篇 查看全部

  初学指南| 用Python进行网页抓取
  
  关于转载授权
  大数据文摘作品,欢迎个人转发朋友圈,自媒体、媒体、机构转载务必申请授权,后台留言“机构名称+转载”,申请过授权的不必再次申请,只要按约定转载即可,但文末需放置大数据文摘二维码。
  编译|丁雪 黄念程序注释|席雄芬校对|姚佳灵
  引言
  从网页中提取信息的需求日益剧增,其重要性也越来越明显。每隔几周,我自己就想要到网页上提取一些信息。比如上周我们考虑建立一个有关各种数据科学在线课程的欢迎程度和意见的索引。我们不仅需要找出新的课程,还要抓取对课程的评论,对它们进行总结后建立一些衡量指标。这是一个问题或产品,其功效更多地取决于网页抓取和信息提取(数据集)的技术,而非以往我们使用的数据汇总技术。
  网页信息提取的方式
  从网页中提取信息有一些方法。使用API可能被认为是从网站提取信息的最佳方法。几乎所有的大型网站,像Twitter、Facebook、Google、Twitter、StackOverflow都提供API以更为结构化的方式访问该网站的数据。如果可以直接通过API得到所需要的信息,那么这个方法几乎总是优于网页抓取方法。因为如果可以从数据提供方得到结构化的数据,为什么还要自己建立一个引擎来提取同样的数据?
  不幸的是,并不是所有的网站都提供API。一些网站是不愿意让读者通过结构化的方式抓取大量的信息,另一些网站是因为缺乏相关的技术知识而不能提供API。在这样的情况下,该怎么做?好吧,我们需要通过网页抓取来获得数据。
  当然还有一些像RSS订阅等的其它方式,但是由于使用上的限制,因此我将不在这里讨论它们。
  
  什么是网页抓取?
  网页抓取是一种从网站中获取信息的计算机软件技术。这种技术主要聚焦于把网络中的非结构化数据(HTML 格式)转变成结构化数据(数据库或电子表格)。
  可以用不同的方式实施网页抓取,包括从Google Docs到几乎所有的编程语言。由于Python的易用性和丰富的生态系统,我会选择使用Python。Python中的BeautifulSoup库可以协助完成这一任务。在本文中,我将会利用Python编程语言给你看学习网页抓取最简单的方式。
  对于需要借助非编程方式提取网页数据的读者,可以去import.io上看看。那上面有基于图形用户界面的驱动来运行网页抓取的基础操作,计算机迷们可以继续看本文!
  网页抓取所需要的库
  我们都知道Python是一门开源编程语言。你也许能找到很多库来实施一个功能。因此,找出最好的库是非常必要的。我倾向于使用BeautifulSoup (Python库),因为它的使用简单直观。准确地说,我会用到两个Python模块来抓取数据:
  •Urllib2:它是一个Python模块,用来获取URL。它定义函数和类,实现URL操作(基本、摘要式身份验证、重定向、cookies等)欲了解更多详情,请参阅文档页面。
  •BeautifulSoup:它是一个神奇的工具,用来从网页中提取信息。可以用它从网页中提取表格、列表、段落,也可以加上过滤器。在本文中,我们将会用最新版本,BeautifulSoup 4。可以在它的文档页面查看安装指南。
  BeautifulSoup不帮我们获取网页,这是我将urllib2和BeautifulSoup 库一起使用的原因。除了BeautifulSoup之外,Python还有其它一些方法用于HTML的抓取。如:
  •mechanize
  •scrapemark
  •scrapy
  基础-熟悉HTML(标签)
  在进行网页抓取时,我们需要处理html标签。因此,我们必须先好好理解一下标签。如果已经了解HTML的基础知识,可以跳过这一节。以下是HTML的基本语法:
  
  该语法的各种标签的解释如下:
  1.:html文档必须以类型声明开始
  2.html文档写在 和标签之间
  3.html文档的可见部分写在 和标签之间
  4.html头使用 到 标签定义
  5.html段落使用
  标签定义
  其它有用的HTML标签是:
  1.html链接使用标签定义,“这是一个测试链接.com”
  2.html表格使用定义,行用表示,行用分为数据
  
  3.html列表以(无序)和(有序)开始,列表中的每个元素以开始
  如果不熟悉这些HTML标签,我建议到W3schools上学习HTML教程。这样对HTML标签会有个清楚的理解。
  使用BeautifulSoup抓取网页
  在这里,我将从维基百科页面上抓取数据。我们的最终目的是抓取印度的邦、联邦首府的列表,以及一些基本细节,如成立信息、前首府和其它组成这个维基百科页面的信息。让我们一步一步做这个项目来学习:
  1.导入必要的库
  2.使用“prettify”函数来看HTML页面的嵌套结构
  
  如上所示,可以看到HTML标签的结构。这将有助于了解不同的可用标签,从而明白如何使用它们来抓取信息。
  3.处理HTML标签
  a.soup.:返回在开始和结束标签之间的内容,包括标签在内。
  
  
  b.soup..string: 返回给定标签内的字符串
  
  c.找出在标签内的链接:我们知道,我们可以用标签标记一个链接。因此,我们应该利用soup.a 选项,它应该返回在网页内可用的链接。我们来做一下。
  
  如上所示,可以看到只有一个结果。现在,我们将使用“find_all()”来抓取中的所有链接。
  上面显示了所有的链接,包括标题、链接和其它信息。现在,为了只显示链接,我们需要使用get的“href”属性:遍历每一个标签,然后再返回链接。
  
  4.找到正确的表:当我们在找一个表以抓取邦首府的信息时,我们应该首先找出正确的表。让我们写指令来抓取所有表标签中的信息。
  
  现在为了找出正确的表,我们将使用表的属性“class(类)”,并用它来筛选出正确的表。在chrome浏览器中,可以通过在所需的网页表格上单击右键来查询其类名–>检查元素–>复制该类名或通过上述命令的输出找到正确的表的类名。
  
  
  5.提取信息放入DataFrame:在这里,我们要遍历每一行(tr),然后将tr的每个元素(td)赋给一个变量,将它添加到列表中。让我们先看看表格的HTML结构(我不想抓取表格标题的信息)
  如上所示,你会注意到的第二个元素在< th >标签内,而不在标签内。因此,对这一点我们需要小心。现在要访问每个元素的值,我们会使用每个元素的“find(text=True)”选项。让我们看一下代码:
  
  
  
  
  最后,我们在dataframe内的数据如下:
  
  类似地,可以用BeautifulSoup实施各种其它类型的网页抓取。这将减轻从网页上手工收集数据的工作。也可以看下其它属性,如.parent,.contents,.descendants 和.next_sibling,.prev_sibling以及各种用于标签名称浏览的属性。这些将有助于您有效地抓取网页。
  但是,为什么我不能只使用正则表达式(Regular Expressions)?
  现在,如果知道正则表达式,你可能会认为可以用它来编写代码做同样的事情。当然,我也有过这个问题。我曾使用BeautifulSoup和正则表达式来做同样的事情,结果发现:
  BeautifulSoup里的代码比用正则表达式写的更强大。用正则表达式编写的代码得随着页面中的变动而进行更改。即使BeautifulSoup在一些情况下需要调整,但相对来讲,BeautifulSoup较好一些。
  正则表达式比BeautifulSoup快得多,对于相同的结果,正则表达式比BeautifulSoup快100倍。
  因此,它归结为速度与代码的鲁棒性之间的比较,这里没有万能的赢家。如果正在寻找的信息可以用简单的正则表达式语句抓取,那么应该选择使用它们。对于几乎所有复杂的工作,我通常更多地建议使用BeautifulSoup,而不是正则表达式。
  结语
  本文中,我们使用了Python的两个库BeautifulSoup和urllib2。我们也了解了HTML的基础知识,并通过解决一个问题,一步一步地实施网页抓取。我建议你练习一下并用它来从网页中搜集数据。
  译者简介丁雪华中师范大学情报学专业硕士,从事用户行为与个性化服务方向的研究。关注大数据的发展,欲从事互联网与咨询行业的相关工作。黄念上海长海医院在读硕士,对生物医药大数据挖掘的及其应用很感兴趣,愿意借助本平台认识更多的小伙伴。席雄芬北京邮电大学无线信号处理专业研究生在读,主要研究图信号处理,对基于社交网络的图数据挖掘感兴趣,希望借助此平台能认识更多的从事大数据方面的人,结交更多的志同道合者。姚佳灵家庭主妇,对数据分析和处理很感兴趣,正在努力学习中,希望能和大家多交流。
  
  【限时干货下载】
  2015/11/30前
  2015年10月干货文件打包下载,请点击大数据文摘底部菜单:下载等--10月下载
  大数据文摘精彩文章:
  回复【金融】 看【金融与商业】专栏历史期刊文章
  回复【可视化】感受技术与艺术的完美结合
  回复【安全】 关于泄密、黑客、攻防的新鲜案例
  回复【算法】 既涨知识又有趣的人和事
  回复【谷歌】 看其在大数据领域的举措
  回复【院士】 看众多院士如何讲大数据
  回复【隐私】 看看在大数据时代还有多少隐私
  回复【医疗】 查看医疗领域文章6篇

o模拟浏览器和gmail客户端模拟消息栏发送信息

网站优化优采云 发表了文章 • 0 个评论 • 38 次浏览 • 2022-06-13 12:06 • 来自相关话题

  o模拟浏览器和gmail客户端模拟消息栏发送信息
  c抓取网页数据。b模拟浏览器和gmail客户端模拟消息栏发送信息,c使用qq对邮件文本进行判断,b模拟qq查找附件。e通过抓包模拟登录网页版进行登录验证。f从gmail中抓取中文姓名验证码。g解析邮件内容然后从邮件系统发送给qq客户端,模拟登录后发送邮件数据至对应的qq邮箱客户端。h从网页抓取验证码图片。o模拟gmail收发短信验证码数据。
  有点意思的问题,我用c写了一个不是很了解的http库,作为一个http模拟登录函数:commonhttpdhttprequestgetcmpgetbackwards都可以生成msg对象,它们可以用来构造请求中的cookie和重定向中的cookie,从而作为request的一个部分发送给response,从而可以把多个session绑定起来。
  方法httprequestcookiebackwardsrequest{requestheaders}这样处理下来,假设模拟登录是普通登录,你可以封装一个webview:commonhttpd::webviewwebview.urlrequest(url,status=200);size=request.format(request.status_code).touch();//过滤浏览器-webview中模拟getcmpcookiebackwards{classrequest1extendscommonhttpd::webview{staticgetcmp(url,null)returnnull;}statichandlererror(requesttarget,status,error,errortext)extendsurlrequest{classcookiebackwardsextendsboolean{cookiebackwards(url,target);}}}webview.urlrequest(url,status,error,errortext);querysetmsg2getmessage(status,request,msg,error,errortext){returnthis.request.urlrequest(msg,request.get(url)).body();}。 查看全部

  o模拟浏览器和gmail客户端模拟消息栏发送信息
  c抓取网页数据。b模拟浏览器和gmail客户端模拟消息栏发送信息,c使用qq对邮件文本进行判断,b模拟qq查找附件。e通过抓包模拟登录网页版进行登录验证。f从gmail中抓取中文姓名验证码。g解析邮件内容然后从邮件系统发送给qq客户端,模拟登录后发送邮件数据至对应的qq邮箱客户端。h从网页抓取验证码图片。o模拟gmail收发短信验证码数据。
  有点意思的问题,我用c写了一个不是很了解的http库,作为一个http模拟登录函数:commonhttpdhttprequestgetcmpgetbackwards都可以生成msg对象,它们可以用来构造请求中的cookie和重定向中的cookie,从而作为request的一个部分发送给response,从而可以把多个session绑定起来。
  方法httprequestcookiebackwardsrequest{requestheaders}这样处理下来,假设模拟登录是普通登录,你可以封装一个webview:commonhttpd::webviewwebview.urlrequest(url,status=200);size=request.format(request.status_code).touch();//过滤浏览器-webview中模拟getcmpcookiebackwards{classrequest1extendscommonhttpd::webview{staticgetcmp(url,null)returnnull;}statichandlererror(requesttarget,status,error,errortext)extendsurlrequest{classcookiebackwardsextendsboolean{cookiebackwards(url,target);}}}webview.urlrequest(url,status,error,errortext);querysetmsg2getmessage(status,request,msg,error,errortext){returnthis.request.urlrequest(msg,request.get(url)).body();}。

Selenium抓取动态网页数据

网站优化优采云 发表了文章 • 0 个评论 • 42 次浏览 • 2022-06-11 19:19 • 来自相关话题

  Selenium抓取动态网页数据

  1.selenium抓取动态网页数据基础介绍1.1 什么是AJAXAJAX(Asynchronouse JavaScript And XML:异步JavaScript和XML)通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行局部更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。因为传统的网页在传输数据格式方面,使用的是XML语法,因此叫做AJAX,其实现在数据交互基本上都是使用JSON。使用AJAX加载的数据,即使使用了JS将数据渲染到了浏览器中,在右键->查看网页源代码还是不能看到通过ajax加载的数据,只能看到使用这个url加载的html代码。1.2 获取ajax数据的方式法1:直接分析ajax调用的接口。然后通过代码请求这个接口。法2:使用Selenium+chromedriver模拟浏览器行为获取数据。
  方式
  优点
  缺点
  分析接口
  直接可以请求到数据。不需要做一些解析工作。代码量少,性能高。
  分析接口比较复杂,特别是一些通过js混淆的接口,要有一定的js功底。容易被发现是爬虫。
  selenium
  直接模拟浏览器的行为。浏览器能请求到的,使用selenium也能请求到。爬虫更稳定。
  代码量多。性能低。
  1.3 Selenium+chromedriver获取动态数据Selenium相当于是一个机器人。可以模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等。chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:Chrome:Firefox:Edge:Safari:1.4 安装Selenium和chromedriver安装Selenium:Selenium有很多语言的版本,有java、ruby、python等。我们下载python版本的就可以了。
   pip install selenium
  安装chromedriver:下载完成后,放到不需要权限的纯英文目录下就可以了。1.5 快速入门现在以一个简单的获取百度首页的例子来讲下Selenium和chromedriver如何快速入门:
  from selenium import webdriver<br /># chromedriver的绝对路径driver_path = r'D:\ProgramApp\chromedriver\chromedriver.exe'<br /># 初始化一个driver,并且指定chromedriver的路径driver = webdriver.Chrome(executable_path=driver_path)# 请求网页driver.get("https://www.baidu.com/")# 通过page_source获取网页源代码print(driver.page_source)
  1.6 selenium常用操作
  1.7 爬取拉钩网职位信息
  直接直接分析ajax调用的接口爬取
  import requestsfrom lxml import etreeimport timeimport re<br /><br />headers = { "Accept":"application/json, text/javascript, */*; q=0.01", "Accept-Encoding":"gzip, deflate, br", "Accept-Language":"zh-CN,zh;q=0.9", "Connection":"keep-alive", "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", "Referer":"https://www.lagou.com/jobs/lis ... ot%3B, "Origin":"https://www.lagou.com", "Host":"www.lagou.com", "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8", "Cookie":"_ga=GA1.2.1602115737.1553064534; user_trace_token=20190320144853-39b1375a-4adc-11e9-a253-525400f775ce; LGUID=20190320144853-39b13f88-4adc-11e9-a253-525400f775ce; WEBTJ-ID=20190408120043-169fb1afd63488-06179b118ca307-7a1437-2073600-169fb1afd648ed; _gid=GA1.2.1826141825.1554696044; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22169fb1bb2c41ea-04951e55adc96a-7a1437-2073600-169fb1bb2c58d0%22%2C%22%24device_id%22%3A%22169fb1bb2c41ea-04951e55adc96a-7a1437-2073600-169fb1bb2c58d0%22%7D; sajssdk_2015_cross_new_user=1; _putrc=4C5D2603888320CA; JSESSIONID=ABAAABAAADEAAFIB00F5DDE71D51610901CB9E0031812BA; login=true; unick=%E4%BC%8D%E6%99%93%E4%B8%BD; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=49; gate_login_token=7b04a40da89145a1fbc90a3d719616d28c8b0a303344ac37; index_location_city=%E6%88%90%E9%83%BD; X_MIDDLE_TOKEN=1221e6b5040722dc86f5ceb557e11965; _gat=1; LGSID=20190408151935-a9976fbf-59ce-11e9-8cc8-5254005c3644; PRE_UTM=m_cf_cpc_baidu_pc; PRE_HOST=www.baidu.com; PRE_SITE=https%3A%2F%2Fwww.baidu.com%2Fbaidu.php%3Fsc.Ks000001qLT2daZnZWIez3ktR_jhHue3tONZubxU9mivhxeuj-Fxrjg6NnVcKTp-GYJ_YRvrc9_yOJ4uV-IEpfnPazPz7ctjve1qlDokCDfHYo9PV0uDfTmN1OunNUcCRU-sJuR8RZz60PAXzfKybAdvuCxUedbt8aWtTjAdCCuO298TwT8zN1-T5EG3kgkOweg0DHGIbvP55IZbr6.DY_NR2Ar5Od663rj6tJQrGvKD7ZZKNfYYmcgpIQC8xxKfYt_U_DY2yP5Qjo4mTT5QX1BsT8rZoG4XL6mEukmryZZjzsLTJplePXO-8zNqrw5Q9tSMj_qTr1x9tqvZul3xg1sSxW9qx-9LdoDkY4QPSl81_4pqO24rM-8dQjPakb3dS5iC0.U1Yk0ZDqs2v4VnL30ZKGm1Yk0Zfqs2v4VnL30A-V5HcsP0KM5gK1n6KdpHdBmy-bIykV0ZKGujYzr0KWpyfqnWcv0AdY5HDsnHIxnH0krNtknjc1g1nsnHNxn1msnfKopHYs0ZFY5HDLn6K-pyfq0AFG5HcsP0KVm1Y3nHDYP1fsrjuxnH0snNtkg1Dsn-ts0Z7spyfqn0Kkmv-b5H00ThIYmyTqn0K9mWYsg100ugFM5H00TZ0qPWm1PHm1rj640A4vTjYsQW0snj0snj0s0AdYTjYs0AwbUL0qn0KzpWYs0Aw-IWdsmsKhIjYs0ZKC5H00ULnqn0KBI1Ykn0K8IjYs0ZPl5fK9TdqGuAnqTZnVUhC0IZN15Hnkn1fknHT4P1DvPHR1PW61P100ThNkIjYkPHRYP10LrHTkPjTY0ZPGujd9rAwBmhuWrj0snjDzrj0Y0AP1UHYsPbm3wWTsrH0srjwarDcz0A7W5HD0TA3qn0KkUgfqn0KkUgnqn0KlIjYs0AdWgvuzUvYqn7tsg1Kxn7ts0Aw9UMNBuNqsUA78pyw15HKxn7tsg1nkrjm4nNts0ZK9I7qhUA7M5H00uAPGujYknjT1P1fkrjcY0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KkUymqn0KhmLNY5H00uMGC5H00uh7Y5H00XMK_Ignqn0K9uAu_myTqnfK_uhnqn0KEIjYs0AqzTZfqnanscznsc100mLFW5HRdPj0Y%26word%3D%25E6%258B%2589%25E5%258B%25BE%25E7%25BD%2591%26ck%3D1701.10.72.227.558.354.602.254%26shh%3Dwww.baidu.com%26sht%3D62095104_19_oem_dg%26us%3D1.0.1.0.1.301.0%26bc%3D110101; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2Flp%2Fhtml%2Fcommon.html%3Futm_source%3Dm_cf_cpc_baidu_pc%26m_kw%3Dbaidu_cpc_cd_e110f9_d2162e_%25E6%258B%2589%25E5%258B%25BE%25E7%25BD%2591; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1553064535,1554696044,1554707975; TG-TRACK-CODE=index_search; SEARCH_ID=16b25888bc6f489f981996ef505d6930; X_HTTP_TOKEN=3704e5535eab672a10080745514b2c7fac0430c282; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1554708001; LGRID=20190408152002-b9743b5b-59ce-11e9-9a84-525400f775ce", "X-Anit-Forge-Code":"0" , "X-Anit-Forge-Token":'', "X-Requested-With":'XMLHttpRequest'}<br />def get_detail_page_url(): datas =[] url = 'https://www.lagou.com/jobs/positionAjax.json' form_data = { "first":"faise", "pn":1, "kd":"python" } params = { 'city':'成都', 'needAddtionalResult':'false' } for pn in range(1,14): form_data['pn'] = pn response = requests.request(method='post',url=url,headers=headers,params = params,data = form_data) result = response.json() result_list = result['content']['positionResult']['result'] for position in result_list: position_id = position['positionId'] detail_url = 'https://www.lagou.com/jobs/%s.html'%position_id data = parse_detail_page(detail_url) datas.append(data) time.sleep(2) return datas<br />def parse_detail_page(url): resonse = requests.request(method='get',url=url,headers = headers) text = resonse.text html = etree.fromstring(text,parser=etree.HTMLParser()) position_name = html.xpath('//span[@class="name"]/text()')[0].strip() detail_list = html.xpath('//dd[@class="job_request"]//span') salary = detail_list[0].xpath('text()')[0].strip() city = detail_list[1].xpath('text()')[0].strip() city = re.sub(r'[\s/]','',city) work_years = detail_list[2].xpath('text()')[0].strip() work_years = re.sub(r'[\s/]','',work_years) education = detail_list[3].xpath('text()')[0].strip() education = re.sub(r'[\s/]','',education) job_details = ''.join(html.xpath('//div[@class="job-detail"]//p//text()')) data = { "position_name":position_name, "salay":salary, "city":city, "work_years":work_years, "education":education, "job_details":job_details<br /> } return data<br /><br /><br />def main(): datas = get_detail_page_url() print(datas)<br />if __name__ == '__main__':    main()
  selenium结合lxml爬取
  from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import By<br />from lxml import etreeimport reimport time<br />class Lagouspider(object): driver_path = r'E:\study\chromedriver\chromedriver.exe' def __init__(self): self.driver = webdriver.Chrome(executable_path=Lagouspider.driver_path) self.url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=' self.positions = []<br /> def run(self): while True: self.driver.get(self.url) source = self.driver.page_source WebDriverWait(driver=self.driver,timeout=10).until(EC.presence_of_element_located((By.XPATH,'//div[@class="pager_container"]/span[last()]'))) self.parse_list_page(source) next_btn = self.driver.find_element_by_xpath('//div[@class="pager_container"]/span[last()]') if "pager_next_disabled" in next_btn.get_attribute('class'): break else: next_btn.click() time.sleep(1)<br /> def parse_list_page(self,source): html = etree.HTML(source) links = html.xpath('//a[@class="position_link"]/@href') for link in links: self.request_detail_page(link) time.sleep(1)<br /> def request_detail_page(self,url): self.driver.execute_script("window.open('%s')"%url) self.driver.switch_to.window(self.driver.window_handles[1]) WebDriverWait(self.driver,timeout=10).until(EC.presence_of_element_located((By.XPATH,'//span[@class="name"]'))) source = self.driver.page_source self.parse_detail_page(source) #关闭当前详情页 self.driver.close() #切换回职位列表页 self.driver.switch_to.window(self.driver.window_handles[0])<br /> def parse_detail_page(self,source): html = etree.HTML(source) position_name = html.xpath('//span[@class="name"]/text()')[0].strip() detail_list = html.xpath('//dd[@class="job_request"]//span') salary = detail_list[0].xpath('text()')[0].strip() city = detail_list[1].xpath('text()')[0].strip() city = re.sub(r'[\s/]', '', city) work_years = detail_list[2].xpath('text()')[0].strip() work_years = re.sub(r'[\s/]', '', work_years) education = detail_list[3].xpath('text()')[0].strip() education = re.sub(r'[\s/]', '', education) desc = ''.join(html.xpath('//dd[@class="job_bt"]//text()')).strip() data = { "name": position_name, "salay": salary, "city": city, "work_years": work_years, "education": education, "desc": desc } print(data) print('+'*40) self.positions.append(data)<br />if __name__ == '__main__': spider = Lagouspider()    spider.run()
  原文链接:
  

  鼓励一下
  
  赞完再走 查看全部

  Selenium抓取动态网页数据

  1.selenium抓取动态网页数据基础介绍1.1 什么是AJAXAJAX(Asynchronouse JavaScript And XML:异步JavaScript和XML)通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行局部更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。因为传统的网页在传输数据格式方面,使用的是XML语法,因此叫做AJAX,其实现在数据交互基本上都是使用JSON。使用AJAX加载的数据,即使使用了JS将数据渲染到了浏览器中,在右键->查看网页源代码还是不能看到通过ajax加载的数据,只能看到使用这个url加载的html代码。1.2 获取ajax数据的方式法1:直接分析ajax调用的接口。然后通过代码请求这个接口。法2:使用Selenium+chromedriver模拟浏览器行为获取数据。
  方式
  优点
  缺点
  分析接口
  直接可以请求到数据。不需要做一些解析工作。代码量少,性能高。
  分析接口比较复杂,特别是一些通过js混淆的接口,要有一定的js功底。容易被发现是爬虫。
  selenium
  直接模拟浏览器的行为。浏览器能请求到的,使用selenium也能请求到。爬虫更稳定。
  代码量多。性能低。
  1.3 Selenium+chromedriver获取动态数据Selenium相当于是一个机器人。可以模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等。chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:Chrome:Firefox:Edge:Safari:1.4 安装Selenium和chromedriver安装Selenium:Selenium有很多语言的版本,有java、ruby、python等。我们下载python版本的就可以了。
   pip install selenium
  安装chromedriver:下载完成后,放到不需要权限的纯英文目录下就可以了。1.5 快速入门现在以一个简单的获取百度首页的例子来讲下Selenium和chromedriver如何快速入门:
  from selenium import webdriver<br /># chromedriver的绝对路径driver_path = r'D:\ProgramApp\chromedriver\chromedriver.exe'<br /># 初始化一个driver,并且指定chromedriver的路径driver = webdriver.Chrome(executable_path=driver_path)# 请求网页driver.get("https://www.baidu.com/";)# 通过page_source获取网页源代码print(driver.page_source)
  1.6 selenium常用操作
  1.7 爬取拉钩网职位信息
  直接直接分析ajax调用的接口爬取
  import requestsfrom lxml import etreeimport timeimport re<br /><br />headers = { "Accept":"application/json, text/javascript, */*; q=0.01", "Accept-Encoding":"gzip, deflate, br", "Accept-Language":"zh-CN,zh;q=0.9", "Connection":"keep-alive", "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", "Referer":"https://www.lagou.com/jobs/lis ... ot%3B, "Origin":"https://www.lagou.com", "Host":"www.lagou.com", "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8", "Cookie":"_ga=GA1.2.1602115737.1553064534; user_trace_token=20190320144853-39b1375a-4adc-11e9-a253-525400f775ce; LGUID=20190320144853-39b13f88-4adc-11e9-a253-525400f775ce; WEBTJ-ID=20190408120043-169fb1afd63488-06179b118ca307-7a1437-2073600-169fb1afd648ed; _gid=GA1.2.1826141825.1554696044; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22169fb1bb2c41ea-04951e55adc96a-7a1437-2073600-169fb1bb2c58d0%22%2C%22%24device_id%22%3A%22169fb1bb2c41ea-04951e55adc96a-7a1437-2073600-169fb1bb2c58d0%22%7D; sajssdk_2015_cross_new_user=1; _putrc=4C5D2603888320CA; JSESSIONID=ABAAABAAADEAAFIB00F5DDE71D51610901CB9E0031812BA; login=true; unick=%E4%BC%8D%E6%99%93%E4%B8%BD; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=49; gate_login_token=7b04a40da89145a1fbc90a3d719616d28c8b0a303344ac37; index_location_city=%E6%88%90%E9%83%BD; X_MIDDLE_TOKEN=1221e6b5040722dc86f5ceb557e11965; _gat=1; LGSID=20190408151935-a9976fbf-59ce-11e9-8cc8-5254005c3644; PRE_UTM=m_cf_cpc_baidu_pc; PRE_HOST=www.baidu.com; PRE_SITE=https%3A%2F%2Fwww.baidu.com%2Fbaidu.php%3Fsc.Ks000001qLT2daZnZWIez3ktR_jhHue3tONZubxU9mivhxeuj-Fxrjg6NnVcKTp-GYJ_YRvrc9_yOJ4uV-IEpfnPazPz7ctjve1qlDokCDfHYo9PV0uDfTmN1OunNUcCRU-sJuR8RZz60PAXzfKybAdvuCxUedbt8aWtTjAdCCuO298TwT8zN1-T5EG3kgkOweg0DHGIbvP55IZbr6.DY_NR2Ar5Od663rj6tJQrGvKD7ZZKNfYYmcgpIQC8xxKfYt_U_DY2yP5Qjo4mTT5QX1BsT8rZoG4XL6mEukmryZZjzsLTJplePXO-8zNqrw5Q9tSMj_qTr1x9tqvZul3xg1sSxW9qx-9LdoDkY4QPSl81_4pqO24rM-8dQjPakb3dS5iC0.U1Yk0ZDqs2v4VnL30ZKGm1Yk0Zfqs2v4VnL30A-V5HcsP0KM5gK1n6KdpHdBmy-bIykV0ZKGujYzr0KWpyfqnWcv0AdY5HDsnHIxnH0krNtknjc1g1nsnHNxn1msnfKopHYs0ZFY5HDLn6K-pyfq0AFG5HcsP0KVm1Y3nHDYP1fsrjuxnH0snNtkg1Dsn-ts0Z7spyfqn0Kkmv-b5H00ThIYmyTqn0K9mWYsg100ugFM5H00TZ0qPWm1PHm1rj640A4vTjYsQW0snj0snj0s0AdYTjYs0AwbUL0qn0KzpWYs0Aw-IWdsmsKhIjYs0ZKC5H00ULnqn0KBI1Ykn0K8IjYs0ZPl5fK9TdqGuAnqTZnVUhC0IZN15Hnkn1fknHT4P1DvPHR1PW61P100ThNkIjYkPHRYP10LrHTkPjTY0ZPGujd9rAwBmhuWrj0snjDzrj0Y0AP1UHYsPbm3wWTsrH0srjwarDcz0A7W5HD0TA3qn0KkUgfqn0KkUgnqn0KlIjYs0AdWgvuzUvYqn7tsg1Kxn7ts0Aw9UMNBuNqsUA78pyw15HKxn7tsg1nkrjm4nNts0ZK9I7qhUA7M5H00uAPGujYknjT1P1fkrjcY0ANYpyfqQHD0mgPsmvnqn0KdTA-8mvnqn0KkUymqn0KhmLNY5H00uMGC5H00uh7Y5H00XMK_Ignqn0K9uAu_myTqnfK_uhnqn0KEIjYs0AqzTZfqnanscznsc100mLFW5HRdPj0Y%26word%3D%25E6%258B%2589%25E5%258B%25BE%25E7%25BD%2591%26ck%3D1701.10.72.227.558.354.602.254%26shh%3Dwww.baidu.com%26sht%3D62095104_19_oem_dg%26us%3D1.0.1.0.1.301.0%26bc%3D110101; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2Flp%2Fhtml%2Fcommon.html%3Futm_source%3Dm_cf_cpc_baidu_pc%26m_kw%3Dbaidu_cpc_cd_e110f9_d2162e_%25E6%258B%2589%25E5%258B%25BE%25E7%25BD%2591; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1553064535,1554696044,1554707975; TG-TRACK-CODE=index_search; SEARCH_ID=16b25888bc6f489f981996ef505d6930; X_HTTP_TOKEN=3704e5535eab672a10080745514b2c7fac0430c282; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1554708001; LGRID=20190408152002-b9743b5b-59ce-11e9-9a84-525400f775ce", "X-Anit-Forge-Code":"0" , "X-Anit-Forge-Token":'', "X-Requested-With":'XMLHttpRequest'}<br />def get_detail_page_url(): datas =[] url = 'https://www.lagou.com/jobs/positionAjax.json' form_data = { "first":"faise", "pn":1, "kd":"python" } params = { 'city':'成都', 'needAddtionalResult':'false' } for pn in range(1,14): form_data['pn'] = pn response = requests.request(method='post',url=url,headers=headers,params = params,data = form_data) result = response.json() result_list = result['content']['positionResult']['result'] for position in result_list: position_id = position['positionId'] detail_url = 'https://www.lagou.com/jobs/%s.html'%position_id data = parse_detail_page(detail_url) datas.append(data) time.sleep(2) return datas<br />def parse_detail_page(url): resonse = requests.request(method='get',url=url,headers = headers) text = resonse.text html = etree.fromstring(text,parser=etree.HTMLParser()) position_name = html.xpath('//span[@class="name"]/text()')[0].strip() detail_list = html.xpath('//dd[@class="job_request"]//span') salary = detail_list[0].xpath('text()')[0].strip() city = detail_list[1].xpath('text()')[0].strip() city = re.sub(r'[\s/]','',city) work_years = detail_list[2].xpath('text()')[0].strip() work_years = re.sub(r'[\s/]','',work_years) education = detail_list[3].xpath('text()')[0].strip() education = re.sub(r'[\s/]','',education) job_details = ''.join(html.xpath('//div[@class="job-detail"]//p//text()')) data = { "position_name":position_name, "salay":salary, "city":city, "work_years":work_years, "education":education, "job_details":job_details<br /> } return data<br /><br /><br />def main(): datas = get_detail_page_url() print(datas)<br />if __name__ == '__main__':    main()
  selenium结合lxml爬取
  from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import By<br />from lxml import etreeimport reimport time<br />class Lagouspider(object): driver_path = r'E:\study\chromedriver\chromedriver.exe' def __init__(self): self.driver = webdriver.Chrome(executable_path=Lagouspider.driver_path) self.url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=' self.positions = []<br /> def run(self): while True: self.driver.get(self.url) source = self.driver.page_source WebDriverWait(driver=self.driver,timeout=10).until(EC.presence_of_element_located((By.XPATH,'//div[@class="pager_container"]/span[last()]'))) self.parse_list_page(source) next_btn = self.driver.find_element_by_xpath('//div[@class="pager_container"]/span[last()]') if "pager_next_disabled" in next_btn.get_attribute('class'): break else: next_btn.click() time.sleep(1)<br /> def parse_list_page(self,source): html = etree.HTML(source) links = html.xpath('//a[@class="position_link"]/@href') for link in links: self.request_detail_page(link) time.sleep(1)<br /> def request_detail_page(self,url): self.driver.execute_script("window.open('%s')"%url) self.driver.switch_to.window(self.driver.window_handles[1]) WebDriverWait(self.driver,timeout=10).until(EC.presence_of_element_located((By.XPATH,'//span[@class="name"]'))) source = self.driver.page_source self.parse_detail_page(source) #关闭当前详情页 self.driver.close() #切换回职位列表页 self.driver.switch_to.window(self.driver.window_handles[0])<br /> def parse_detail_page(self,source): html = etree.HTML(source) position_name = html.xpath('//span[@class="name"]/text()')[0].strip() detail_list = html.xpath('//dd[@class="job_request"]//span') salary = detail_list[0].xpath('text()')[0].strip() city = detail_list[1].xpath('text()')[0].strip() city = re.sub(r'[\s/]', '', city) work_years = detail_list[2].xpath('text()')[0].strip() work_years = re.sub(r'[\s/]', '', work_years) education = detail_list[3].xpath('text()')[0].strip() education = re.sub(r'[\s/]', '', education) desc = ''.join(html.xpath('//dd[@class="job_bt"]//text()')).strip() data = { "name": position_name, "salay": salary, "city": city, "work_years": work_years, "education": education, "desc": desc } print(data) print('+'*40) self.positions.append(data)<br />if __name__ == '__main__': spider = Lagouspider()    spider.run()
  原文链接:
  

  鼓励一下
  
  赞完再走

官方客服QQ群

微信人工客服

QQ人工客服


线