
浏览器抓取网页
浏览器抓取网页(知道了要访问的URL地址是什么)
网站优化 • 优采云 发表了文章 • 0 个评论 • 44 次浏览 • 2022-01-20 02:14
1.我知道要访问的URL地址是什么
请求网址
2.【可选】如果是GET方法,是否还有其他参数
这个参数:
3.判断是GET还是POST方法
4.添加对应的标头(Header)信息
即请求头
5.【可选】如果是POST方式,还需要填写对应的数据
这个数据:
换句话说:
如果是 GET,则没有 POST 数据。
提示:所以,在你在 IE9 中通过 F12 抓取的内容中,你会看到对于所有的 GET 请求,对应的“请求体”都是空的。
6.其他一些你可能需要准备的东西
(1)代理代理
(2)设置最大超时超时时间
(3)有没有cookie
提交HttpRequest,就可以得到这个http请求的response Response(访问URL后要做的工作)
1.得到对应的响应
2.从响应中获取对应的网页源码等信息
(1)获取返回网页的HTML源代码(或json等)
(2)[可选] 必要时也获取对应的cookie
(3)[可选]判断返回的一些其他相关信息,如响应码等。
【网页抓取时的注意事项】
1.网页跳转重定向
(1)直接跳转
(2)间接跳转
A.javascript脚本中有对应的代码实现网页跳转
B、自身返回的HTML源码中收录刷新动作,实现网页跳转
爬网后,如何分析得到想要的内容
一般来说,当你访问一个 URL 地址时,返回的内容大部分是网页的 HTML 源代码,还有其他形式的内容,比如 json 等。
我们要的是从返回的内容(HTML或者json等)中提取出我们需要的具体信息,也就是对其进行处理,得到需要的信息。
据我所知,有几种方法可以实现提取所需信息:
1. 对于 HTML 源代码:
(1)如果是Python的话,可以通过调用第三方Beautifulsoup库调用
然后调用find等函数提取相应的信息。
这部分内容比较复杂,需要进一步了解,可以参考:
BlogsToWordPress v3.0 – 将百度空间、网易163等博客移至WordPress
中的源代码。
(2)直接使用正则表达式自行提取相关内容
对于内容分析和提取,在很多情况下都会用到正则表达式。
正则表达式的知识和总结,请看这里:
[总结] 关于正则表达式 v2012-02-20
正则表达式是一种规范/规则,您可以使用哪种语言来实现它。
我遇到过两种语言,Python 和 C#:
A. Python:使用re模块,常用函数有find、findall、search等。
B:C#:使用Regex类来匹配对应的模式和匹配函数。
有关 C# 中的正则表达式的更多信息,请参阅:
【总结】C#中Regex的经验及注意事项
2.对于 Json
可以先看一下JSON的介绍:
【组织】什么是JSON+如何处理JSON字符串
然后看看下面如何处理Json。
(1)使用库(函数)来处理
A. 蟒蛇
Python中有对应的json库。常用的是json.load,可以将json格式的字符串转换成对应的字典类型变量,非常好用。
(2) 还是用正则表达式处理
A. 蟒蛇
Python 中的 re 模块,同上。
B. C#
C#好像没有json库,但是第三方json库有很多,但是遇到解析json字符串的时候,感觉这些库用起来还是很麻烦,所以还是用regex类来处理它。.
模拟登录的一般逻辑和流程网站
至于使用C#实现网页内容爬取和模拟登陆网页,一些经验和注意事项,看这里: 查看全部
浏览器抓取网页(知道了要访问的URL地址是什么)
1.我知道要访问的URL地址是什么
请求网址
2.【可选】如果是GET方法,是否还有其他参数
这个参数:
3.判断是GET还是POST方法
4.添加对应的标头(Header)信息
即请求头
5.【可选】如果是POST方式,还需要填写对应的数据
这个数据:
换句话说:
如果是 GET,则没有 POST 数据。
提示:所以,在你在 IE9 中通过 F12 抓取的内容中,你会看到对于所有的 GET 请求,对应的“请求体”都是空的。
6.其他一些你可能需要准备的东西
(1)代理代理
(2)设置最大超时超时时间
(3)有没有cookie
提交HttpRequest,就可以得到这个http请求的response Response(访问URL后要做的工作)
1.得到对应的响应
2.从响应中获取对应的网页源码等信息
(1)获取返回网页的HTML源代码(或json等)
(2)[可选] 必要时也获取对应的cookie
(3)[可选]判断返回的一些其他相关信息,如响应码等。
【网页抓取时的注意事项】
1.网页跳转重定向
(1)直接跳转
(2)间接跳转
A.javascript脚本中有对应的代码实现网页跳转
B、自身返回的HTML源码中收录刷新动作,实现网页跳转
爬网后,如何分析得到想要的内容
一般来说,当你访问一个 URL 地址时,返回的内容大部分是网页的 HTML 源代码,还有其他形式的内容,比如 json 等。
我们要的是从返回的内容(HTML或者json等)中提取出我们需要的具体信息,也就是对其进行处理,得到需要的信息。
据我所知,有几种方法可以实现提取所需信息:
1. 对于 HTML 源代码:
(1)如果是Python的话,可以通过调用第三方Beautifulsoup库调用
然后调用find等函数提取相应的信息。
这部分内容比较复杂,需要进一步了解,可以参考:
BlogsToWordPress v3.0 – 将百度空间、网易163等博客移至WordPress
中的源代码。
(2)直接使用正则表达式自行提取相关内容
对于内容分析和提取,在很多情况下都会用到正则表达式。
正则表达式的知识和总结,请看这里:
[总结] 关于正则表达式 v2012-02-20
正则表达式是一种规范/规则,您可以使用哪种语言来实现它。
我遇到过两种语言,Python 和 C#:
A. Python:使用re模块,常用函数有find、findall、search等。
B:C#:使用Regex类来匹配对应的模式和匹配函数。
有关 C# 中的正则表达式的更多信息,请参阅:
【总结】C#中Regex的经验及注意事项
2.对于 Json
可以先看一下JSON的介绍:
【组织】什么是JSON+如何处理JSON字符串
然后看看下面如何处理Json。
(1)使用库(函数)来处理
A. 蟒蛇
Python中有对应的json库。常用的是json.load,可以将json格式的字符串转换成对应的字典类型变量,非常好用。
(2) 还是用正则表达式处理
A. 蟒蛇
Python 中的 re 模块,同上。
B. C#
C#好像没有json库,但是第三方json库有很多,但是遇到解析json字符串的时候,感觉这些库用起来还是很麻烦,所以还是用regex类来处理它。.
模拟登录的一般逻辑和流程网站
至于使用C#实现网页内容爬取和模拟登陆网页,一些经验和注意事项,看这里:
浏览器抓取网页(基于Windows注册表实现浏览器安装位置的查找功能和使用指定浏览器打开网页的功能)
网站优化 • 优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2022-01-19 12:03
说明
本程序基于Windows注册表实现搜索浏览器安装位置的功能和使用指定浏览器打开网页的功能。
使用get_browser_path函数获取对应名称浏览器的安装位置,使用open_url函数直接使用指定浏览器打开对应页面,
可以同时指定多个浏览器,优先级从前到后。目前支持'IE'、'chrome'、'edge'、'firefox'、'360'等浏览器。如果还有其他浏览器需要支持,只需在_browser_regs中添加相应的注册表信息即可。
代码
"""
使用 get_browser_path 函数可获取对应名称的浏览器的安装位置,使用 open_url 函数可直接使用指定的浏览器打开对应页面,
可同时指定多个浏览器,优先级从前到后。当前支持 'IE','chrome','edge','firefox','360' 等浏览器,如果有其他浏览器需要支持,只需在 _browser_regs 中补充对应注册表信息即可
"""
import webbrowser
import winreg
# 浏览器注册表信息
_browser_regs = {
'IE': r"SOFTWARE\Clients\StartMenuInternet\IEXPLORE.EXE\DefaultIcon",
'chrome': r"SOFTWARE\Clients\StartMenuInternet\Google Chrome\DefaultIcon",
'edge': r"SOFTWARE\Clients\StartMenuInternet\Microsoft Edge\DefaultIcon",
'firefox': r"SOFTWARE\Clients\StartMenuInternet\FIREFOX.EXE\DefaultIcon",
'360': r"SOFTWARE\Clients\StartMenuInternet\360Chrome\DefaultIcon",
}
def get_browser_path(browser):
"""
获取浏览器的安装路径
:param browser: 浏览器名称
"""
try:
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, _browser_regs[browser])
except FileNotFoundError:
return None
value, _type = winreg.QueryValueEx(key, "")
return value.split(',')[0]
def open_url(url, browsers=('IE',)):
"""
使用指定的浏览器打开url对应的网页地址
:param url: 网页地址
:param browsers: 浏览器名称列表
:return: 是否打开成功
"""
for browser in browsers:
path = get_browser_path(browser)
if path:
print(f'open with browser: `{browser}`, path: `{path}`')
webbrowser.register(browser, None, webbrowser.BackgroundBrowser(path))
webbrowser.get(browser).open(url)
return True
return False
if __name__ == '__main__':
print("IE:", get_browser_path('IE'))
print("谷歌:", get_browser_path('chrome'))
print("edge: ", get_browser_path('edge'))
print("火狐:", get_browser_path('firefox'))
print("360: ", get_browser_path('360'))
if open_url('www.baidu.com', browsers=('chrome', 'firefox')):
print('打开成功')
else:
print('打开失败,请安装 Chrome 或 Firefox 浏览器后重试')
运行结果 查看全部
浏览器抓取网页(基于Windows注册表实现浏览器安装位置的查找功能和使用指定浏览器打开网页的功能)
说明
本程序基于Windows注册表实现搜索浏览器安装位置的功能和使用指定浏览器打开网页的功能。
使用get_browser_path函数获取对应名称浏览器的安装位置,使用open_url函数直接使用指定浏览器打开对应页面,
可以同时指定多个浏览器,优先级从前到后。目前支持'IE'、'chrome'、'edge'、'firefox'、'360'等浏览器。如果还有其他浏览器需要支持,只需在_browser_regs中添加相应的注册表信息即可。
代码
"""
使用 get_browser_path 函数可获取对应名称的浏览器的安装位置,使用 open_url 函数可直接使用指定的浏览器打开对应页面,
可同时指定多个浏览器,优先级从前到后。当前支持 'IE','chrome','edge','firefox','360' 等浏览器,如果有其他浏览器需要支持,只需在 _browser_regs 中补充对应注册表信息即可
"""
import webbrowser
import winreg
# 浏览器注册表信息
_browser_regs = {
'IE': r"SOFTWARE\Clients\StartMenuInternet\IEXPLORE.EXE\DefaultIcon",
'chrome': r"SOFTWARE\Clients\StartMenuInternet\Google Chrome\DefaultIcon",
'edge': r"SOFTWARE\Clients\StartMenuInternet\Microsoft Edge\DefaultIcon",
'firefox': r"SOFTWARE\Clients\StartMenuInternet\FIREFOX.EXE\DefaultIcon",
'360': r"SOFTWARE\Clients\StartMenuInternet\360Chrome\DefaultIcon",
}
def get_browser_path(browser):
"""
获取浏览器的安装路径
:param browser: 浏览器名称
"""
try:
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, _browser_regs[browser])
except FileNotFoundError:
return None
value, _type = winreg.QueryValueEx(key, "")
return value.split(',')[0]
def open_url(url, browsers=('IE',)):
"""
使用指定的浏览器打开url对应的网页地址
:param url: 网页地址
:param browsers: 浏览器名称列表
:return: 是否打开成功
"""
for browser in browsers:
path = get_browser_path(browser)
if path:
print(f'open with browser: `{browser}`, path: `{path}`')
webbrowser.register(browser, None, webbrowser.BackgroundBrowser(path))
webbrowser.get(browser).open(url)
return True
return False
if __name__ == '__main__':
print("IE:", get_browser_path('IE'))
print("谷歌:", get_browser_path('chrome'))
print("edge: ", get_browser_path('edge'))
print("火狐:", get_browser_path('firefox'))
print("360: ", get_browser_path('360'))
if open_url('www.baidu.com', browsers=('chrome', 'firefox')):
print('打开成功')
else:
print('打开失败,请安装 Chrome 或 Firefox 浏览器后重试')
运行结果
浏览器抓取网页(新建隐身窗口的学习目标和学习方法(一))
网站优化 • 优采云 发表了文章 • 0 个评论 • 65 次浏览 • 2022-01-17 15:16
学习目标
1、了解创建新隐身窗口的目的;
2、了解chrome中network的使用;
3、了解如何找到登录界面;
1 创建一个新的隐身窗口
在浏览器中直接打开网站会自动带上之前网站中保存的cookie,但是爬虫第一次获取页面时并没有携带cookie。如何解决这种情况?
使用隐身窗口,第一次打开网站,不带cookie,可以观察页面获取情况,包括对方服务器如何在本地设置cookie。
2、chrome中网络的更多功能
2.1 保存日志
默认情况下,页面跳转后,之前的请求url地址等信息会消失,查看perserve日志后会保留之前的请求。
2.2 过滤器过滤
当url地址较多时,可以在过滤器中输入一些url地址,对所有url地址都有一定的过滤作用。具体位置在上面第二张图中2的位置。
2.3 监视特定类型的请求
在上面第二张图中3的位置,有很多选择。沉默者全选,即各种请求都会被观察。在很多情况下,可以根据自己的目的选择所有右边的其他选项,例如常见的选项:
XHR:在大多数情况下,它代表一个ajax请求;
JS:js请求;
CSS:css请求;
但是很多时候我们并不能保证我们需要什么类型的请求,尤其是当我们不知道一个请求是不是ajax请求的时候,我们可以直接全选,前后观察。能。
不要被浏览器中的一堆请求吓到。除了js、css、图片请求,其他的请求并不多。
3 找到登录界面
回顾人人网之前的爬虫,我们发现了一个登录界面,那么这个界面是从哪里来的呢?
可以发现,这个地址就是表单中action对应的url地址。回顾前端知识点,可以发现是提交表单的地址,对应的提交数据只需要:在用户名的输入标签中,使用name的值作为key,用户名作为value,在password的input标签中,name的value作为key,password作为value。
思考:
没有对应action的url地址怎么办?
3.2 通过抓包找到登录的url地址
通过抓包可以发现这个url地址和请求权重中有参数,比如uniqueTimestamp和rkey以及加密密码
这时候我们可以观察手机版的登录界面是否一样。 查看全部
浏览器抓取网页(新建隐身窗口的学习目标和学习方法(一))
学习目标
1、了解创建新隐身窗口的目的;
2、了解chrome中network的使用;
3、了解如何找到登录界面;
1 创建一个新的隐身窗口
在浏览器中直接打开网站会自动带上之前网站中保存的cookie,但是爬虫第一次获取页面时并没有携带cookie。如何解决这种情况?
使用隐身窗口,第一次打开网站,不带cookie,可以观察页面获取情况,包括对方服务器如何在本地设置cookie。
2、chrome中网络的更多功能

2.1 保存日志
默认情况下,页面跳转后,之前的请求url地址等信息会消失,查看perserve日志后会保留之前的请求。
2.2 过滤器过滤
当url地址较多时,可以在过滤器中输入一些url地址,对所有url地址都有一定的过滤作用。具体位置在上面第二张图中2的位置。
2.3 监视特定类型的请求
在上面第二张图中3的位置,有很多选择。沉默者全选,即各种请求都会被观察。在很多情况下,可以根据自己的目的选择所有右边的其他选项,例如常见的选项:
XHR:在大多数情况下,它代表一个ajax请求;
JS:js请求;
CSS:css请求;
但是很多时候我们并不能保证我们需要什么类型的请求,尤其是当我们不知道一个请求是不是ajax请求的时候,我们可以直接全选,前后观察。能。
不要被浏览器中的一堆请求吓到。除了js、css、图片请求,其他的请求并不多。
3 找到登录界面
回顾人人网之前的爬虫,我们发现了一个登录界面,那么这个界面是从哪里来的呢?

可以发现,这个地址就是表单中action对应的url地址。回顾前端知识点,可以发现是提交表单的地址,对应的提交数据只需要:在用户名的输入标签中,使用name的值作为key,用户名作为value,在password的input标签中,name的value作为key,password作为value。
思考:
没有对应action的url地址怎么办?
3.2 通过抓包找到登录的url地址

通过抓包可以发现这个url地址和请求权重中有参数,比如uniqueTimestamp和rkey以及加密密码
这时候我们可以观察手机版的登录界面是否一样。
浏览器抓取网页(从IE浏览器获取当前页面内容可能有多种方式的资料)
网站优化 • 优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2022-01-16 20:18
从IE浏览器获取当前页面内容的方法可能有很多种,今天就介绍其中的一种。基本原理:鼠标点击当前IE页面时,获取鼠标的坐标位置,根据鼠标位置获取当前页面的句柄,然后根据句柄调用win32的东西获取页面内容。感兴趣的朋友可以参考以下文章
private void timer1_Tick(object sender, EventArgs e)
{
lock (currentLock)
{
System.Drawing.Point MousePoint = System.Windows.Forms.Form.MousePosition;
if (_leftClick)
{
timer1.Stop();
_leftClick = false;
_lastDocument = GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false));
if (_lastDocument != null)
{
if (_getDocument)
{
_getDocument = true;
try
{
string url = _lastDocument.url;
string html = _lastDocument.documentElement.outerHTML;
string cookie = _lastDocument.cookie;
string domain = _lastDocument.domain;
var resolveParams = new ResolveParam
{
Url = new Uri(url),
Html = html,
PageCookie = cookie,
Domain = domain
};
RequetResove(resolveParams);
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
}
}
else
{
new MessageTip().Show("xx", "当前页面不是IE浏览器页面,或使用了非IE内核浏览器,如火狐,搜狗等。请使用IE浏览器打开网页");
}
_getDocument = false;
}
else
{
_pointFrm.Left = MousePoint.X + 10;
_pointFrm.Top = MousePoint.Y + 10;
}
}
}
在第11行GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false))的分解下,首先从鼠标坐标获取页面句柄:
public static IntPtr GetPointControl(System.Drawing.Point p, bool allControl)
{
IntPtr handle = Win32APIsFull.WindowFromPoint(p);
if (handle != IntPtr.Zero)
{
System.Drawing.Rectangle rect = default(System.Drawing.Rectangle);
if (Win32APIsFull.GetWindowRect(handle, out rect))
{
return Win32APIsFull.ChildWindowFromPointEx(handle, new System.Drawing.Point(p.X - rect.X, p.Y - rect.Y), allControl ? Win32APIsFull.CWP.ALL : Win32APIsFull.CWP.SKIPINVISIBLE);
}
}
return IntPtr.Zero;
}
接下来根据句柄获取页面内容:
public static HTMLDocument GetHTMLDocumentFormHwnd(IntPtr hwnd)
{
IntPtr result = Marshal.AllocHGlobal(4);
Object obj = null;
Console.WriteLine(Win32APIsFull.SendMessageTimeoutA(hwnd, HTML_GETOBJECT_mid, 0, 0, 2, 1000, result));
if (Marshal.ReadInt32(result) != 0)
{
Console.WriteLine(Win32APIsFull.ObjectFromLresult(Marshal.ReadInt32(result), ref IID_IHTMLDocument, 0, out obj));
}
Marshal.FreeHGlobal(result);
return obj as HTMLDocument;
}
一般原则:
向IE窗体发送消息,获取指向IE浏览器内存块的指针(非托管),然后根据该指针获取HTMLDocument对象。
该方法涉及win32的两个功能:
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "SendMessageTimeoutA")]
public static extern int SendMessageTimeoutA(
[InAttribute()] System.IntPtr hWnd,
uint Msg, uint wParam, int lParam,
uint fuFlags,
uint uTimeout,
System.IntPtr lpdwResult);
[System.Runtime.InteropServices.DllImportAttribute("oleacc.dll", EntryPoint = "ObjectFromLresult")]
public static extern int ObjectFromLresult(
int lResult,
ref Guid riid,
int wParam,
[MarshalAs(UnmanagedType.IDispatch), Out]
out Object pObject
);
以上是c#从IE浏览器获取当前页面内容的详细内容。更多c#获取浏览器页面内容请关注Scripting Home文章的其他相关话题! 查看全部
浏览器抓取网页(从IE浏览器获取当前页面内容可能有多种方式的资料)
从IE浏览器获取当前页面内容的方法可能有很多种,今天就介绍其中的一种。基本原理:鼠标点击当前IE页面时,获取鼠标的坐标位置,根据鼠标位置获取当前页面的句柄,然后根据句柄调用win32的东西获取页面内容。感兴趣的朋友可以参考以下文章
private void timer1_Tick(object sender, EventArgs e)
{
lock (currentLock)
{
System.Drawing.Point MousePoint = System.Windows.Forms.Form.MousePosition;
if (_leftClick)
{
timer1.Stop();
_leftClick = false;
_lastDocument = GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false));
if (_lastDocument != null)
{
if (_getDocument)
{
_getDocument = true;
try
{
string url = _lastDocument.url;
string html = _lastDocument.documentElement.outerHTML;
string cookie = _lastDocument.cookie;
string domain = _lastDocument.domain;
var resolveParams = new ResolveParam
{
Url = new Uri(url),
Html = html,
PageCookie = cookie,
Domain = domain
};
RequetResove(resolveParams);
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
}
}
else
{
new MessageTip().Show("xx", "当前页面不是IE浏览器页面,或使用了非IE内核浏览器,如火狐,搜狗等。请使用IE浏览器打开网页");
}
_getDocument = false;
}
else
{
_pointFrm.Left = MousePoint.X + 10;
_pointFrm.Top = MousePoint.Y + 10;
}
}
}
在第11行GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false))的分解下,首先从鼠标坐标获取页面句柄:
public static IntPtr GetPointControl(System.Drawing.Point p, bool allControl)
{
IntPtr handle = Win32APIsFull.WindowFromPoint(p);
if (handle != IntPtr.Zero)
{
System.Drawing.Rectangle rect = default(System.Drawing.Rectangle);
if (Win32APIsFull.GetWindowRect(handle, out rect))
{
return Win32APIsFull.ChildWindowFromPointEx(handle, new System.Drawing.Point(p.X - rect.X, p.Y - rect.Y), allControl ? Win32APIsFull.CWP.ALL : Win32APIsFull.CWP.SKIPINVISIBLE);
}
}
return IntPtr.Zero;
}
接下来根据句柄获取页面内容:
public static HTMLDocument GetHTMLDocumentFormHwnd(IntPtr hwnd)
{
IntPtr result = Marshal.AllocHGlobal(4);
Object obj = null;
Console.WriteLine(Win32APIsFull.SendMessageTimeoutA(hwnd, HTML_GETOBJECT_mid, 0, 0, 2, 1000, result));
if (Marshal.ReadInt32(result) != 0)
{
Console.WriteLine(Win32APIsFull.ObjectFromLresult(Marshal.ReadInt32(result), ref IID_IHTMLDocument, 0, out obj));
}
Marshal.FreeHGlobal(result);
return obj as HTMLDocument;
}
一般原则:
向IE窗体发送消息,获取指向IE浏览器内存块的指针(非托管),然后根据该指针获取HTMLDocument对象。
该方法涉及win32的两个功能:
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "SendMessageTimeoutA")]
public static extern int SendMessageTimeoutA(
[InAttribute()] System.IntPtr hWnd,
uint Msg, uint wParam, int lParam,
uint fuFlags,
uint uTimeout,
System.IntPtr lpdwResult);
[System.Runtime.InteropServices.DllImportAttribute("oleacc.dll", EntryPoint = "ObjectFromLresult")]
public static extern int ObjectFromLresult(
int lResult,
ref Guid riid,
int wParam,
[MarshalAs(UnmanagedType.IDispatch), Out]
out Object pObject
);
以上是c#从IE浏览器获取当前页面内容的详细内容。更多c#获取浏览器页面内容请关注Scripting Home文章的其他相关话题!
浏览器抓取网页( Python中一个非常成熟的库——selenium专栏(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 137 次浏览 • 2022-01-13 12:15
Python中一个非常成熟的库——selenium专栏(组图))
本系列文章收录在公众号:数据宇宙>py爬虫>Selenium
转发本文并私信我“python”,可以获得Python资料及更多系列文章(持续更新)
作为“数据玩家”,手头没有数据怎么办?当然,用代码自动化采集数据,但现在“爬虫”可没那么容易了,其中最难的是突破网站的各种反爬机制。本系列将全面讲解Python中一个非常成熟的库——selenium,并教你如何使用它在网络上爬取你需要的数据
虽然自动爬虫很方便,但希望大家可以考虑到网站服务器的承受能力,不要频繁访问网站。永远不要采集敏感数据!!否则很容易“从入门到监狱”
本系列大部分案例都是selenium和pyppeteer库同时讲解的,并且有Python和C#2语言的实现文章,详情请到公众号目录。
当你得到数据时,你还需要对数据进行处理和分析。我的 pandas 专栏是高级教程的最佳介绍。
前言
学习任何库,首先要了解库的机制和流程。今天,我们将从一个小例子开始我们的学习之旅。
搜索和采集结果的标题
要求如下:
硒的问题
这个系列一直围绕着一个点:“用代码操作浏览器”,我们来看看整个过程:
然而,市面上的浏览器种类繁多,甚至一个厂商的浏览器版本也不同。我们如何保证我们的代码只需要编写一次就可以控制不同的浏览器?
更深入的流程图如下:
“案子怎么还没开始,就说硒不是?我还在学吗?”
他有以下优点:
缺点:
如果觉得不能接受selenium的缺点,可以查看pyppeteer的相关文章(公众号:大数据宇宙>py爬虫>pyppeteer)
得到驱动
现在让我们开始使用 selenium 来解决我们的需求。
首先,使用 pip 安装 selenium
由于我在本地安装了谷歌Chrome浏览器,打开浏览器查看浏览器的版本:
然后去相关的网站(私信我“python”)下载对应的驱动:
一切都准备好了
看过我相关教学文章的人都知道,我喜欢从语义的角度去理解和学习图书馆。
Selenium 本质上控制着浏览器,所以我们在使用它的时候,代码的语义应该类似于手动操作浏览器的过程。
首先导入一些包:
让我们看看如何使用代码来描述我们的手动操作。
打开浏览器:
没错,我们只是下载了驱动程序,但是 Python 怎么知道在哪里可以找到该驱动程序呢?
我们可以在实例化浏览器对象的时候传入一个文件路径,告诉他程序的具体位置:
输入百度搜索的网址:
将鼠标移动到输入框,点击一次,然后输入内容“爬虫”:
这里的问题是,如何在代码中表达“鼠标到输入框,点击一次”?
其实selenium确实可以模拟鼠标移动等操作(网站的一些登录验证码需要用鼠标拉动拼图来模拟),但是目前的情况下,我们不应该模拟鼠标,而是根据html标签定位。.
此时,我们可以使用浏览器的“开发者功能”进行定位。
限于篇幅,本文不详细讲解“开发者功能”的所有操作,详细讲解会放在公众号目录:数据宇宙>爬虫工具>系列文章
下面用一张动态图来展示操作过程:
看一下代码:
接下来,输入内容“爬虫”:
我们继续模拟点击输入框右侧的“百度点击”按钮。
同样使用“开发人员功能”,找到元素并复制 css 选择器表达式字符串:
所有结果的主标题:
这对初学者来说可能有点困难,因为这一次我们需要同时选择多个元素(多个搜索结果的主标题),并查看定位到的标签:
仔细看看我们需要的主要标题在哪里:
所以,现在我们将使用 CSS 选择器来表达以下语义: 在 div 内部 (id=content_left),在 h3 标记内部的 a 标记文本。div 和 h3 之间可能有多层嵌套。
生成的选择器表达式如下:
调用代码如下:
Python基础教程教材 Python编程从零基础到实际项目实例
¥59
买
代码执行太快
上面的代码之所以没有得到任何结果,是因为执行第10行的代码时,页面上还没有加载任何结果。
如果一个人正在操作浏览器,那么你应该对他说:嘿,直到你看到那些结果,你去提取主标题。
怎么说“直到你看到那些结果”?,selenium有一种特殊的等待元素出现的机制,代码如下:
用控件关闭浏览器,完整代码如下:
总结
使用代码控制 selenium 与手动操作基本相同。一般流程是:
下一节,我们将介绍更多的selenium技能,敬请期待!!
私信我“python”获取本系列所有相关资料和源码文章 查看全部
浏览器抓取网页(
Python中一个非常成熟的库——selenium专栏(组图))
本系列文章收录在公众号:数据宇宙>py爬虫>Selenium
转发本文并私信我“python”,可以获得Python资料及更多系列文章(持续更新)
作为“数据玩家”,手头没有数据怎么办?当然,用代码自动化采集数据,但现在“爬虫”可没那么容易了,其中最难的是突破网站的各种反爬机制。本系列将全面讲解Python中一个非常成熟的库——selenium,并教你如何使用它在网络上爬取你需要的数据
虽然自动爬虫很方便,但希望大家可以考虑到网站服务器的承受能力,不要频繁访问网站。永远不要采集敏感数据!!否则很容易“从入门到监狱”
本系列大部分案例都是selenium和pyppeteer库同时讲解的,并且有Python和C#2语言的实现文章,详情请到公众号目录。
当你得到数据时,你还需要对数据进行处理和分析。我的 pandas 专栏是高级教程的最佳介绍。
前言
学习任何库,首先要了解库的机制和流程。今天,我们将从一个小例子开始我们的学习之旅。
搜索和采集结果的标题
要求如下:
硒的问题
这个系列一直围绕着一个点:“用代码操作浏览器”,我们来看看整个过程:
然而,市面上的浏览器种类繁多,甚至一个厂商的浏览器版本也不同。我们如何保证我们的代码只需要编写一次就可以控制不同的浏览器?
更深入的流程图如下:
“案子怎么还没开始,就说硒不是?我还在学吗?”
他有以下优点:
缺点:
如果觉得不能接受selenium的缺点,可以查看pyppeteer的相关文章(公众号:大数据宇宙>py爬虫>pyppeteer)
得到驱动
现在让我们开始使用 selenium 来解决我们的需求。
首先,使用 pip 安装 selenium
由于我在本地安装了谷歌Chrome浏览器,打开浏览器查看浏览器的版本:
然后去相关的网站(私信我“python”)下载对应的驱动:
一切都准备好了
看过我相关教学文章的人都知道,我喜欢从语义的角度去理解和学习图书馆。
Selenium 本质上控制着浏览器,所以我们在使用它的时候,代码的语义应该类似于手动操作浏览器的过程。
首先导入一些包:
让我们看看如何使用代码来描述我们的手动操作。
打开浏览器:
没错,我们只是下载了驱动程序,但是 Python 怎么知道在哪里可以找到该驱动程序呢?
我们可以在实例化浏览器对象的时候传入一个文件路径,告诉他程序的具体位置:
输入百度搜索的网址:
将鼠标移动到输入框,点击一次,然后输入内容“爬虫”:
这里的问题是,如何在代码中表达“鼠标到输入框,点击一次”?
其实selenium确实可以模拟鼠标移动等操作(网站的一些登录验证码需要用鼠标拉动拼图来模拟),但是目前的情况下,我们不应该模拟鼠标,而是根据html标签定位。.
此时,我们可以使用浏览器的“开发者功能”进行定位。
限于篇幅,本文不详细讲解“开发者功能”的所有操作,详细讲解会放在公众号目录:数据宇宙>爬虫工具>系列文章
下面用一张动态图来展示操作过程:
看一下代码:
接下来,输入内容“爬虫”:
我们继续模拟点击输入框右侧的“百度点击”按钮。
同样使用“开发人员功能”,找到元素并复制 css 选择器表达式字符串:
所有结果的主标题:
这对初学者来说可能有点困难,因为这一次我们需要同时选择多个元素(多个搜索结果的主标题),并查看定位到的标签:
仔细看看我们需要的主要标题在哪里:
所以,现在我们将使用 CSS 选择器来表达以下语义: 在 div 内部 (id=content_left),在 h3 标记内部的 a 标记文本。div 和 h3 之间可能有多层嵌套。
生成的选择器表达式如下:
调用代码如下:
Python基础教程教材 Python编程从零基础到实际项目实例
¥59
买
代码执行太快
上面的代码之所以没有得到任何结果,是因为执行第10行的代码时,页面上还没有加载任何结果。
如果一个人正在操作浏览器,那么你应该对他说:嘿,直到你看到那些结果,你去提取主标题。
怎么说“直到你看到那些结果”?,selenium有一种特殊的等待元素出现的机制,代码如下:
用控件关闭浏览器,完整代码如下:
总结
使用代码控制 selenium 与手动操作基本相同。一般流程是:
下一节,我们将介绍更多的selenium技能,敬请期待!!
私信我“python”获取本系列所有相关资料和源码文章
浏览器抓取网页( UC浏览器关闭云加速功能方法设置-gt(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 252 次浏览 • 2022-01-13 12:11
UC浏览器关闭云加速功能方法设置-gt(组图))
近期有用户反馈:使用UC、Quark等国产浏览器访问部分网站博客会被屏蔽
出现类似“根据监管部门规定和投诉举报,此链接违反相关法律法规,禁止访问”的提示。
基于国产软件自带大量bucket和后门的一贯做法,不推荐使用各种“国产”浏览器。个人推荐:Chrome、Firefox。
如果一定要使用UC、Quark等国产浏览器,为了解决拦截问题,可以关闭这些浏览器所谓的“云加速”功能。
所谓云加速就是访问一个网站,不是直接访问网站地址,而是先请求UC和Quark的服务器,再请求UC,
Quark的服务器抓取目标网站的内容,对网页内容进行处理(如压缩、排版),返回给浏览器。
也是因为 UC 和 Quark 起到了类似代理服务器的作用。2G时代,UC浏览器就以这个功能而闻名。
在当前的5G时代,云加速功能不仅不提速,还经常拖慢网页的速度。
如何在 UC 浏览器中禁用云加速
设置 -> 快速/保存流媒体以关闭“云加速”和“快速模式”
如何在 Quark 浏览器中禁用云加速
设置 -> 常规 -> 云加速
关闭“云加速”
如何关闭QQ浏览器的云加速功能
设置->保存流加速->云加速关闭“云加速”
360浏览器如何关闭云加速
设置 -> 网页浏览设置 -> 云加速
关闭“云加速”
其他浏览器也有类似的设置项自己去发现。
除了浏览器的原因,网页被屏蔽,也可能是运营商等原因造成的。
在三大运营商中,中国移动经常莫名其妙地屏蔽合规网页。 查看全部
浏览器抓取网页(
UC浏览器关闭云加速功能方法设置-gt(组图))
近期有用户反馈:使用UC、Quark等国产浏览器访问部分网站博客会被屏蔽
出现类似“根据监管部门规定和投诉举报,此链接违反相关法律法规,禁止访问”的提示。
基于国产软件自带大量bucket和后门的一贯做法,不推荐使用各种“国产”浏览器。个人推荐:Chrome、Firefox。
如果一定要使用UC、Quark等国产浏览器,为了解决拦截问题,可以关闭这些浏览器所谓的“云加速”功能。
所谓云加速就是访问一个网站,不是直接访问网站地址,而是先请求UC和Quark的服务器,再请求UC,
Quark的服务器抓取目标网站的内容,对网页内容进行处理(如压缩、排版),返回给浏览器。
也是因为 UC 和 Quark 起到了类似代理服务器的作用。2G时代,UC浏览器就以这个功能而闻名。
在当前的5G时代,云加速功能不仅不提速,还经常拖慢网页的速度。
如何在 UC 浏览器中禁用云加速
设置 -> 快速/保存流媒体以关闭“云加速”和“快速模式”
如何在 Quark 浏览器中禁用云加速
设置 -> 常规 -> 云加速
关闭“云加速”
如何关闭QQ浏览器的云加速功能
设置->保存流加速->云加速关闭“云加速”
360浏览器如何关闭云加速
设置 -> 网页浏览设置 -> 云加速
关闭“云加速”
其他浏览器也有类似的设置项自己去发现。
除了浏览器的原因,网页被屏蔽,也可能是运营商等原因造成的。
在三大运营商中,中国移动经常莫名其妙地屏蔽合规网页。
浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
网站优化 • 优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2022-01-12 11:13
urllib.error.HTTPError:HTTP 错误 403:禁止
从403 Forbidden我们可以发现,此时网站禁止程序的访问,这是因为csdn网站已经设置了反爬虫机制,当网站检测到一个爬虫,访问会被拒绝,所以我们会得到上面的结果。
这时候我们需要模拟浏览器访问,为了避开网站的反爬虫机制,然后顺利抓取我们想要的内容。
接下来,我们将使用一个神奇的库 urllib.request.Request 进行我们的模拟工作。这次我们先代码再讲解,不过这次要提醒一下,下面的代码不能直接使用。其中my_headers中的User-Agent替换为我自己的。因为我加了省略号保密,所以不能直接使用。替换方法如下图所示。这次为了使用方便,介绍一下功能:
#coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/")
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
使用上面的代码,我们就可以正常抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
既然我们要模拟一个浏览器访问网页,这些参数自然需要我们在浏览器中搜索。
首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下框架,然后我们点击Network,然后我们会发现我们所在页面的信息确实不出现,没关系,这时候我们刷新页面,就会出现下图所示的信息。
这时候我们会在第一行看到51251757,这就是我们网页的URL后面的标签。这时候,当我们点击这个标签的时候,就会出现下图所示的内容:
这是我现在通过直接访问此 URL 获得的屏幕截图:
前两张图,我以前写的是版本2的访问,现在直接用了。当时我在csdn主页上点击了这个博客,所以我在代码中填写了referer,在我的header中填写了前两张图片。是的
,而这张图是我直接通过URL链接进入浏览器的,所以从图中可以看出,referer是,这是我们的网站,贴在这里是为了让大家更好的理解这个referer . 不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候千万不要使用我给的User-Agent,因为我用省略号替换了一些。每个人都应该用自己的方式来弥补。
这时候我们会找到Headers,有没有亮眼的感觉,是的,你的直觉是对的,我们需要的信息就在这个Headers里面。
然后,根据代码中需要的参数,把信息复制回来使用,因为这里显示的信息正好对应key值,所以我们复制使用非常方便。
现在介绍一下这个urllib.request.Request的用法(翻译自官方文档):
classurllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None) 参数: url:不用说,这是我们即将访问的网站,它是一个细绳。数据:数据必须是一个字节对象,指定要发送到服务器的附加数据,如果不需要,则为无。目前,只有 HTTP 请求使用数据;当提供数据参数时,HTTP 请求应该是 POST 而不是 GET。数据应以标准 application/x-www-form-urlencoded 格式缓冲。urllib.parse.urlencode() 函数采用映射或二进制序列并返回该格式的 ASCII 字符串。当用作数据参数时,应将其编码为字节。(我们暂时不会使用这个,所以不管它) headers:headers 是一个字符的典型数据。当使用键和值参数调用 add_header() 时,标头将作为请求处理。该标头通常用于防止爬虫访问服务器。header 是浏览器用来标识自己的,因为有些 HTTP 服务器只允许来自普通浏览器的请求,而不是脚本(可以理解为爬虫)。
这必然增加了网站服务器的处理负担,即一个网站必须在爬虫检测和网站服务器的计算负担之间做一个权衡,所以不是爬虫检测机制越严格越好,还要考虑服务器的负担。origin_req_host:origin_req_host 应该是原创事务请求的主机,由 RFC 2965 定义。默认为 http.cookiejar.request_host(self)。
这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是请求收录图像的页面的主机。(我们一般不用这个,这里就知道了) unverifiable:unverifiable 应该表示请求是否不可验证,由 RFC 2965 定义,默认值为 false。无法验证的请求是指无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器获取图片时,此时unverifiable应该为true。method:method 应该是一个字符串,指示要使用的 HTTP 请求方法(例如“header”)。如果提供,它的值存储在方法属性中,并通过方法 get_method() 调用。子类可以通过设置类的方法属性来指示默认方法。(这个基本不用)说了这么多无聊的定义,自己翻译都受不了了。让我们继续回到我们的程序:对于我们的程序,只需抓住几个要点。首先,我们需要构造一个请求:req =Request(url),这个时候请求是空的,我们需要在里面添加信息,给浏览器看。
req.add_header("User-Agent", random_header) 告诉网络服务器我正在通过浏览器访问,我不是爬虫。req.add_header("GET",url)是告诉浏览器我们访问的URL,req.add_header("Host","")是网站的信息,我们从网站开始随便填一下,req.add_header("Referer","")这句话很重要,它告诉网站服务器我们在哪里找到了我们要访问的网页,比如你点击了百度如果一个link跳转到当前访问的页面,referer是百度中的链接,是一种判断机制。对标头的构造函数也可以这样做:
#coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/")
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
如上程序所示,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent被写死了。其实我们可以发现,对于不同的电脑主机访问同一个网页时,我们的其他三个信息:GET、Host、Referer可能都是一样的。此时仅以User-Agent作为判断用户异同的标准。那么问题来了。如果我们从同学那里“借”一些User-Agent来使用,模拟多用户访问不是更有趣吗?其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agent,然后通过random函数随机选择一个组合起来创建一个用户。多路访问的错觉实际上非常有用。要知道,对于一个网站,当访问次数过多时,用户的ip会被屏蔽。这一点都不好玩,所以如果你想永久访问一个网站而不被抓住,还是需要很多技巧的。
当我们要爬取一个网站的多个网页时,由于主机访问频繁,很容易被网站检测到,进而被屏蔽。而如果我们在列表中加入更多不同的主机号,然后随机使用,是不是很容易被发现?当然,当我们为了防止这种情况,更好的方法是使用IP代理,因为我们不容易被发现。可以获得很多主机信息,IP代理也很容易从网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。 查看全部
浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
urllib.error.HTTPError:HTTP 错误 403:禁止
从403 Forbidden我们可以发现,此时网站禁止程序的访问,这是因为csdn网站已经设置了反爬虫机制,当网站检测到一个爬虫,访问会被拒绝,所以我们会得到上面的结果。
这时候我们需要模拟浏览器访问,为了避开网站的反爬虫机制,然后顺利抓取我们想要的内容。
接下来,我们将使用一个神奇的库 urllib.request.Request 进行我们的模拟工作。这次我们先代码再讲解,不过这次要提醒一下,下面的代码不能直接使用。其中my_headers中的User-Agent替换为我自己的。因为我加了省略号保密,所以不能直接使用。替换方法如下图所示。这次为了使用方便,介绍一下功能:
#coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/")
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
使用上面的代码,我们就可以正常抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
既然我们要模拟一个浏览器访问网页,这些参数自然需要我们在浏览器中搜索。
首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下框架,然后我们点击Network,然后我们会发现我们所在页面的信息确实不出现,没关系,这时候我们刷新页面,就会出现下图所示的信息。
这时候我们会在第一行看到51251757,这就是我们网页的URL后面的标签。这时候,当我们点击这个标签的时候,就会出现下图所示的内容:
这是我现在通过直接访问此 URL 获得的屏幕截图:
前两张图,我以前写的是版本2的访问,现在直接用了。当时我在csdn主页上点击了这个博客,所以我在代码中填写了referer,在我的header中填写了前两张图片。是的
,而这张图是我直接通过URL链接进入浏览器的,所以从图中可以看出,referer是,这是我们的网站,贴在这里是为了让大家更好的理解这个referer . 不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候千万不要使用我给的User-Agent,因为我用省略号替换了一些。每个人都应该用自己的方式来弥补。
这时候我们会找到Headers,有没有亮眼的感觉,是的,你的直觉是对的,我们需要的信息就在这个Headers里面。
然后,根据代码中需要的参数,把信息复制回来使用,因为这里显示的信息正好对应key值,所以我们复制使用非常方便。
现在介绍一下这个urllib.request.Request的用法(翻译自官方文档):
classurllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None) 参数: url:不用说,这是我们即将访问的网站,它是一个细绳。数据:数据必须是一个字节对象,指定要发送到服务器的附加数据,如果不需要,则为无。目前,只有 HTTP 请求使用数据;当提供数据参数时,HTTP 请求应该是 POST 而不是 GET。数据应以标准 application/x-www-form-urlencoded 格式缓冲。urllib.parse.urlencode() 函数采用映射或二进制序列并返回该格式的 ASCII 字符串。当用作数据参数时,应将其编码为字节。(我们暂时不会使用这个,所以不管它) headers:headers 是一个字符的典型数据。当使用键和值参数调用 add_header() 时,标头将作为请求处理。该标头通常用于防止爬虫访问服务器。header 是浏览器用来标识自己的,因为有些 HTTP 服务器只允许来自普通浏览器的请求,而不是脚本(可以理解为爬虫)。
这必然增加了网站服务器的处理负担,即一个网站必须在爬虫检测和网站服务器的计算负担之间做一个权衡,所以不是爬虫检测机制越严格越好,还要考虑服务器的负担。origin_req_host:origin_req_host 应该是原创事务请求的主机,由 RFC 2965 定义。默认为 http.cookiejar.request_host(self)。
这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是请求收录图像的页面的主机。(我们一般不用这个,这里就知道了) unverifiable:unverifiable 应该表示请求是否不可验证,由 RFC 2965 定义,默认值为 false。无法验证的请求是指无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器获取图片时,此时unverifiable应该为true。method:method 应该是一个字符串,指示要使用的 HTTP 请求方法(例如“header”)。如果提供,它的值存储在方法属性中,并通过方法 get_method() 调用。子类可以通过设置类的方法属性来指示默认方法。(这个基本不用)说了这么多无聊的定义,自己翻译都受不了了。让我们继续回到我们的程序:对于我们的程序,只需抓住几个要点。首先,我们需要构造一个请求:req =Request(url),这个时候请求是空的,我们需要在里面添加信息,给浏览器看。
req.add_header("User-Agent", random_header) 告诉网络服务器我正在通过浏览器访问,我不是爬虫。req.add_header("GET",url)是告诉浏览器我们访问的URL,req.add_header("Host","")是网站的信息,我们从网站开始随便填一下,req.add_header("Referer","")这句话很重要,它告诉网站服务器我们在哪里找到了我们要访问的网页,比如你点击了百度如果一个link跳转到当前访问的页面,referer是百度中的链接,是一种判断机制。对标头的构造函数也可以这样做:
#coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/")
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
如上程序所示,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent被写死了。其实我们可以发现,对于不同的电脑主机访问同一个网页时,我们的其他三个信息:GET、Host、Referer可能都是一样的。此时仅以User-Agent作为判断用户异同的标准。那么问题来了。如果我们从同学那里“借”一些User-Agent来使用,模拟多用户访问不是更有趣吗?其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agent,然后通过random函数随机选择一个组合起来创建一个用户。多路访问的错觉实际上非常有用。要知道,对于一个网站,当访问次数过多时,用户的ip会被屏蔽。这一点都不好玩,所以如果你想永久访问一个网站而不被抓住,还是需要很多技巧的。
当我们要爬取一个网站的多个网页时,由于主机访问频繁,很容易被网站检测到,进而被屏蔽。而如果我们在列表中加入更多不同的主机号,然后随机使用,是不是很容易被发现?当然,当我们为了防止这种情况,更好的方法是使用IP代理,因为我们不容易被发现。可以获得很多主机信息,IP代理也很容易从网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。
浏览器抓取网页(PHP手册(再次一句一句以强调)手册真乃圣经)
网站优化 • 优采云 发表了文章 • 0 个评论 • 37 次浏览 • 2022-01-12 11:11
抓取网页内容,PHP内置了几个可以实现的函数,如file()、file_get_contents()等,都支持URL参数。但是要实现更复杂的操作,这些函数就无能为力了。
cURL 是一个文件传输工具,它使用 URL 语法在命令行下工作。 cURL 提供了一个 PHP 扩展。使用此扩展,您可以完全模拟浏览器操作,就像使用浏览器浏览网页一样。可以设置header内容、设置cookie数据、POST数据、上传文件、设置代理等。其实我们这里讨论的爬取网页内容只是它常用的应用之一。
cURL 官方网站:
PHP cURL 扩展:
在 Windows 下添加这个扩展就像加载 php_curl.dll 一样简单。去掉php.ini文件extension=php_curl.dll前面的分号,将php_curl.dll复制到PHP扩展目录或者C:\Windows\system32目录下重启web服务器。 php_curl.dll 在 PHP 的 ZIP 包中提供。
在Linux下,需要先安装cURL。一种方法是编译成PHP,编译配置时加上--with-curl[=DIR]。另一种方法是将其编译成一个PHP模块来加载,编译cURL模块的方法和编译其他PHP模块的方法是一样的,以下是基本命令:
cd /path/to/php/source 进入PHP源码目录
cd ext/curl 进入cURL模块的源码目录
/usr/local/php/bin/phpize 生成编译配置文件
./configure --with-php-config=/usr/local/php/bin/php-config
制作
进行安装
编译完成生成curl.so,修改php.ini,加载模块:
extension="/path/to/extension/curl.so"
测试是否加载了cURL扩展,新建一个PHP文件:
网页抓取示例:
curl_setopt()可以设置很多选项,更多选项请参考PHP手册。
更多函数及其用法请参考PHP手册(再次强调PHP手册真的是圣经)。
转载于: 查看全部
浏览器抓取网页(PHP手册(再次一句一句以强调)手册真乃圣经)
抓取网页内容,PHP内置了几个可以实现的函数,如file()、file_get_contents()等,都支持URL参数。但是要实现更复杂的操作,这些函数就无能为力了。
cURL 是一个文件传输工具,它使用 URL 语法在命令行下工作。 cURL 提供了一个 PHP 扩展。使用此扩展,您可以完全模拟浏览器操作,就像使用浏览器浏览网页一样。可以设置header内容、设置cookie数据、POST数据、上传文件、设置代理等。其实我们这里讨论的爬取网页内容只是它常用的应用之一。
cURL 官方网站:
PHP cURL 扩展:
在 Windows 下添加这个扩展就像加载 php_curl.dll 一样简单。去掉php.ini文件extension=php_curl.dll前面的分号,将php_curl.dll复制到PHP扩展目录或者C:\Windows\system32目录下重启web服务器。 php_curl.dll 在 PHP 的 ZIP 包中提供。
在Linux下,需要先安装cURL。一种方法是编译成PHP,编译配置时加上--with-curl[=DIR]。另一种方法是将其编译成一个PHP模块来加载,编译cURL模块的方法和编译其他PHP模块的方法是一样的,以下是基本命令:
cd /path/to/php/source 进入PHP源码目录
cd ext/curl 进入cURL模块的源码目录
/usr/local/php/bin/phpize 生成编译配置文件
./configure --with-php-config=/usr/local/php/bin/php-config
制作
进行安装
编译完成生成curl.so,修改php.ini,加载模块:
extension="/path/to/extension/curl.so"
测试是否加载了cURL扩展,新建一个PHP文件:
网页抓取示例:
curl_setopt()可以设置很多选项,更多选项请参考PHP手册。
更多函数及其用法请参考PHP手册(再次强调PHP手册真的是圣经)。
转载于:
浏览器抓取网页(网页获取和解析速度和性能的应用场景详解! )
网站优化 • 优采云 发表了文章 • 0 个评论 • 54 次浏览 • 2022-01-11 13:14
)
(4)支持代理
(5)支持自动cookie管理等。
Java爬虫开发是应用最广泛的网页获取技术。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐用于快速访问网页。无需解析脚本和 CSS 的场景。
示例代码如下:
package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
汤
jsoup 是一个 Java HTML 解析器,可以直接解析一个 URL 地址和 HTML 文本内容。它提供了一个非常省力的 API,用于通过 DOM、CSS 和类似 jQuery 的操作方法获取和操作数据。
网页获取解析速度快,推荐。
主要功能如下:
1. 从 URL、文件或字符串解析 HTML;
2. 使用 DOM 或 CSS 选择器来查找和检索数据;
3. 可以操作 HTML 元素、属性、文本;
示例代码如下:
package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
html单元
htmlunit 是一个开源的java页面分析工具。阅读完页面后,可以有效地使用htmlunit分析页面上的内容。该项目可以模拟浏览器的操作,称为java浏览器的开源实现。这个没有界面的浏览器运行速度非常快。使用 Rhinojs 引擎。模拟js运行。
网页获取和解析速度快,性能更好。推荐用于需要解析网页脚本的应用场景。
示例代码如下:
package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
瓦蒂
Watij(发音为 wattage)是一个用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 使您能够在真实浏览器中自动测试 Web 应用程序。因为调用本地浏览器,所以支持CSS渲染和JS执行。
网页访问速度一般,IE版本太低(6/7)可能会导致内存泄漏。
示例代码如下:
package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
硒
Selenium 也是一个用于 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试与浏览器的兼容性——测试您的应用程序是否在不同的浏览器和操作系统上运行良好。测试系统功能 - 创建回归测试以验证软件功能和用户需求。支持动作的自动记录和自动生成。Net、Java、Perl 和其他不同语言的测试脚本。Selenium 是 ThoughtWorks 专门为 Web 应用程序编写的验收测试工具。
网页抓取速度慢,对于爬虫来说不是一个好的选择。
示例代码如下:
package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
网络规范
具有支持脚本执行和 CSS 呈现的界面的开源 Java 浏览器。平均速度。
示例代码如下:
package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}} 查看全部
浏览器抓取网页(网页获取和解析速度和性能的应用场景详解!
)
(4)支持代理
(5)支持自动cookie管理等。
Java爬虫开发是应用最广泛的网页获取技术。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐用于快速访问网页。无需解析脚本和 CSS 的场景。
示例代码如下:
package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
汤
jsoup 是一个 Java HTML 解析器,可以直接解析一个 URL 地址和 HTML 文本内容。它提供了一个非常省力的 API,用于通过 DOM、CSS 和类似 jQuery 的操作方法获取和操作数据。
网页获取解析速度快,推荐。
主要功能如下:
1. 从 URL、文件或字符串解析 HTML;
2. 使用 DOM 或 CSS 选择器来查找和检索数据;
3. 可以操作 HTML 元素、属性、文本;
示例代码如下:
package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
html单元
htmlunit 是一个开源的java页面分析工具。阅读完页面后,可以有效地使用htmlunit分析页面上的内容。该项目可以模拟浏览器的操作,称为java浏览器的开源实现。这个没有界面的浏览器运行速度非常快。使用 Rhinojs 引擎。模拟js运行。
网页获取和解析速度快,性能更好。推荐用于需要解析网页脚本的应用场景。
示例代码如下:
package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
瓦蒂
Watij(发音为 wattage)是一个用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 使您能够在真实浏览器中自动测试 Web 应用程序。因为调用本地浏览器,所以支持CSS渲染和JS执行。
网页访问速度一般,IE版本太低(6/7)可能会导致内存泄漏。
示例代码如下:
package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
硒
Selenium 也是一个用于 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试与浏览器的兼容性——测试您的应用程序是否在不同的浏览器和操作系统上运行良好。测试系统功能 - 创建回归测试以验证软件功能和用户需求。支持动作的自动记录和自动生成。Net、Java、Perl 和其他不同语言的测试脚本。Selenium 是 ThoughtWorks 专门为 Web 应用程序编写的验收测试工具。
网页抓取速度慢,对于爬虫来说不是一个好的选择。
示例代码如下:
package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
网络规范
具有支持脚本执行和 CSS 呈现的界面的开源 Java 浏览器。平均速度。
示例代码如下:
package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}}
浏览器抓取网页(几个抓取算法:1、宽度优先抓取策略(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2022-01-11 13:14
搜索引擎如何抓取网页 搜索引擎看似简单的抓取-入库-查询工作,但每个链接中隐含的算法却非常复杂。搜索引擎依靠蜘蛛来完成爬取页面的工作。爬取动作很容易实现,但是先爬哪些页面,先爬哪些页面需要算法来决定。下面介绍几种爬取算法:1、广度优先爬取策略:我们都知道网站页面大部分是按照树形图分布的,所以在树形图的链接结构中,页面会先被爬取吗?为什么要优先抓取这些页面?广度优先爬取策略是先按照树形图结构爬取同级链接,然后在同级链接爬取完成后,再爬取下一级链接。如下图: 可以看到,我在表达的时候,使用的是链接结构,而不是网站结构。这里的链接结构可以收录任何页面的链接,不一定是网站内部链接。这是一种理想化的广度优先抓取策略。在实际抓取过程中,不可能先想到全宽,而是先限制宽,如下图所示: 上图中,我们的蜘蛛在检索G链接的时候,通过算法发现G页面没有价值,所以悲剧的G链接和低级的H链接被Spider协调。至于为什么G链接是和谐的?好吧,我们来分析一下。2、不完整的遍历链路权重计算:
互联网几乎是无限的,每天都会产生大量的新链接。搜索引擎对链接权重的计算只能是不完全遍历。为什么 Google PR 需要每三个月更新一次?为什么百度一个月更新一两次?这是因为搜索引擎使用非完全遍历链接权重算法来计算链接权重。其实按照现在的技术,实现更快的频率权重更新并不难,计算速度和存储速度完全可以跟上,但为什么不去做呢?因为没那么必要,或者已经实现了,但是我不想发布。那么,什么是非完整遍历链路权重计算呢?我们形成一组K个链接,R代表链接获得的pagerank,S代表链接收录的链接数量,Q代表是否参与传递,β代表阻尼因子,则链接得到的权重计算公式为: 从公式可以看出Q决定链接重量。如果发现链接作弊,或者搜索引擎被手动删除,或者其他原因,将Q设置为0,那么再多的外部链接就没用了。β为阻尼因子,其主要作用是防止权重0的出现,使链路无法参与权重传递,防止作弊的出现。阻尼系数β一般为0.85。为什么阻尼因子乘以网站的个数?因为不是一个页面中的所有页面都参与权重转移,所以搜索引擎会再次删除 15% 的已过滤链接。
因此,在此基础上,出现了实时权重分布抓取策略。即蜘蛛爬完页面并进入后,立即进行权重分配,将权重重新分配给要爬取的链接库,然后蜘蛛根据权重进行爬取。3、社会工程抓取策略 社会工程策略是在蜘蛛爬行的过程中加入人工智能或经过人工智能训练的机器智能来确定爬行的优先级。目前我知道的爬取策略有:热点优先策略:针对爆破热点关键词优先抓取,不需要经过严格的去重和过滤,因为会有新的链接覆盖和用户的主动选择。湾。权限优先策略:搜索引擎会给每一个网站分配一个权威度,通过网站历史、网站更新等确定网站的权威度,取权威度高的网站 链接。C。用户点击策略:当大多数在行业词库中搜索关键词,并且经常点击同一网站的搜索结果时,搜索引擎会更频繁地抓取这个网站。d。历史参考策略:对于不断更新频繁的网站,搜索引擎会为网站建立更新历史,并根据更新历史估计未来更新量,确定爬取频率。SEO工作指导:搜索引擎爬取原理已经深入讲解,所以现在有必要说明一下这些原则对SEO工作的指导作用: A. 定期定量的更新,让蜘蛛按时爬到网站页面;B.公司运营网站比个人网站更有权威性;C、网站建站时间长,更容易被爬取;D. 链接在页面中分布要合理,太多或太少都不好;E、受用户欢迎的网站也受搜索引擎欢迎;F、重要的页面应该放在较浅的网站结构中;G、网站中的行业权限信息会增加网站的权限。本教程就是这样,下一篇教程的主题是:页面价值和网站权重的计算。 查看全部
浏览器抓取网页(几个抓取算法:1、宽度优先抓取策略(组图))
搜索引擎如何抓取网页 搜索引擎看似简单的抓取-入库-查询工作,但每个链接中隐含的算法却非常复杂。搜索引擎依靠蜘蛛来完成爬取页面的工作。爬取动作很容易实现,但是先爬哪些页面,先爬哪些页面需要算法来决定。下面介绍几种爬取算法:1、广度优先爬取策略:我们都知道网站页面大部分是按照树形图分布的,所以在树形图的链接结构中,页面会先被爬取吗?为什么要优先抓取这些页面?广度优先爬取策略是先按照树形图结构爬取同级链接,然后在同级链接爬取完成后,再爬取下一级链接。如下图: 可以看到,我在表达的时候,使用的是链接结构,而不是网站结构。这里的链接结构可以收录任何页面的链接,不一定是网站内部链接。这是一种理想化的广度优先抓取策略。在实际抓取过程中,不可能先想到全宽,而是先限制宽,如下图所示: 上图中,我们的蜘蛛在检索G链接的时候,通过算法发现G页面没有价值,所以悲剧的G链接和低级的H链接被Spider协调。至于为什么G链接是和谐的?好吧,我们来分析一下。2、不完整的遍历链路权重计算:
互联网几乎是无限的,每天都会产生大量的新链接。搜索引擎对链接权重的计算只能是不完全遍历。为什么 Google PR 需要每三个月更新一次?为什么百度一个月更新一两次?这是因为搜索引擎使用非完全遍历链接权重算法来计算链接权重。其实按照现在的技术,实现更快的频率权重更新并不难,计算速度和存储速度完全可以跟上,但为什么不去做呢?因为没那么必要,或者已经实现了,但是我不想发布。那么,什么是非完整遍历链路权重计算呢?我们形成一组K个链接,R代表链接获得的pagerank,S代表链接收录的链接数量,Q代表是否参与传递,β代表阻尼因子,则链接得到的权重计算公式为: 从公式可以看出Q决定链接重量。如果发现链接作弊,或者搜索引擎被手动删除,或者其他原因,将Q设置为0,那么再多的外部链接就没用了。β为阻尼因子,其主要作用是防止权重0的出现,使链路无法参与权重传递,防止作弊的出现。阻尼系数β一般为0.85。为什么阻尼因子乘以网站的个数?因为不是一个页面中的所有页面都参与权重转移,所以搜索引擎会再次删除 15% 的已过滤链接。
因此,在此基础上,出现了实时权重分布抓取策略。即蜘蛛爬完页面并进入后,立即进行权重分配,将权重重新分配给要爬取的链接库,然后蜘蛛根据权重进行爬取。3、社会工程抓取策略 社会工程策略是在蜘蛛爬行的过程中加入人工智能或经过人工智能训练的机器智能来确定爬行的优先级。目前我知道的爬取策略有:热点优先策略:针对爆破热点关键词优先抓取,不需要经过严格的去重和过滤,因为会有新的链接覆盖和用户的主动选择。湾。权限优先策略:搜索引擎会给每一个网站分配一个权威度,通过网站历史、网站更新等确定网站的权威度,取权威度高的网站 链接。C。用户点击策略:当大多数在行业词库中搜索关键词,并且经常点击同一网站的搜索结果时,搜索引擎会更频繁地抓取这个网站。d。历史参考策略:对于不断更新频繁的网站,搜索引擎会为网站建立更新历史,并根据更新历史估计未来更新量,确定爬取频率。SEO工作指导:搜索引擎爬取原理已经深入讲解,所以现在有必要说明一下这些原则对SEO工作的指导作用: A. 定期定量的更新,让蜘蛛按时爬到网站页面;B.公司运营网站比个人网站更有权威性;C、网站建站时间长,更容易被爬取;D. 链接在页面中分布要合理,太多或太少都不好;E、受用户欢迎的网站也受搜索引擎欢迎;F、重要的页面应该放在较浅的网站结构中;G、网站中的行业权限信息会增加网站的权限。本教程就是这样,下一篇教程的主题是:页面价值和网站权重的计算。
浏览器抓取网页(关键词的提取和转载和修改再带来的便利性)
网站优化 • 优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2022-01-11 13:12
搜索引擎在抓取大量原创网页时,会进行预处理,主要包括四个方面,关键词的提取,“镜像网页”(网页内容完全一致)未经任何修改)或“转载网页”。”(近副本,主题内容基本相同但可能有一些额外的编辑信息等,转载的页面也称为“近似镜像页面”)消除,链接分析和页面的重要性计算。
提取1.关键词,取一个网页的源文件(比如通过浏览器的“查看源文件”功能),可以看出情况比较复杂。从知识和实践的角度来看,收录的关键词就是这个特性的最佳代表。因此,作为预处理阶段的一项基本任务,就是提取网页源文件内容部分收录的关键词。对于中文来说,就是使用所谓的“切字软件”,根据字典Σ从网页文本中剪出Σ中收录的单词。之后,一个网页主要由一组词来近似,p = {t1, t2, ..., tn}。一般来说,我们可能会得到很多词,而同一个词可能会在一个网页中出现多次。从有效性和效率的角度来看,所有的词都不应该出现在网页的表示中。“de”、“in”等没有表示意义的内容的词要去掉,称为“停用词”。”(停用词)。这样,对于一个网页来说,有效词的数量大约是 200 个。
2. 消除重复或转载网页,固有的数字化和网络化为网页的复制、转载和再版带来了便利,因此我们在网络上看到了大量的重复信息。这种现象对广大网民来说是积极的,因为有更多的机会获取信息。但对于搜索引擎来说,主要是负面的;不仅在采集网页时会消耗机器时间和网络带宽资源,而且如果出现在查询结果中,会毫无意义地消耗电脑屏幕资源,还会招来用户的抱怨,“这么多重复,给我一个就够了”。因此,剔除具有重复内容或主题内容的网页是搜索引擎在网页抓取阶段的一项重要工作。
3、链接分析,大量的HTML标签不仅给网页的预处理带来了一些麻烦,也带来了一些新的机会。从信息检索的角度来看,如果系统只处理内容的文本,我们可以依靠的是“shared bag of words”(共享词袋),即关键词@的集合> 收录在内容中,最多加上一个词条在文档集合中的词条频率(或tf,TF)和文档频率(document frequency 或df,DF)等统计信息。而 TF 和 DF 等频率信息可以在一定程度上表明词在文档中的相对重要性或某些内容的相关性,这是有意义的。使用 HTML 标签,情况可能会进一步改善,例如在同一个文档中,和之间的信息可能比和之间的信息更重要。特别是HTML文档中收录的其他文档的链接信息是近年来特别关注的对象,相信它们不仅给出了网页之间的关系,而且在判断网页内容方面也起着重要作用。页。
4、网页重要性的计算,搜索引擎其实追求的是一种统计意义上的满足感。人们认为谷歌目前比百度好,或者百度比谷歌好,参考取决于前者返回的内容在大多数情况下更符合用户的需求,但并非在所有情况下。查询结果的排序方式需要考虑很多因素。如何说一个网页比另一个网页更重要?人们引用科学文献重要性的评价方法,其核心思想是“被引用越多越重要”。通过 HTML 超链接,网页之间可以很好地体现“引用”的概念。PageRank,这是谷歌创造的核心技术,是这一理念的成功体现。此外,人们还注意到网页和文档的不同特点,即有的网页主要链接大量的外部链接,基本没有明确的主题内容,而其他网页则以链接方式链接。大量其他网页。从某种意义上说,这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 有的网页主要链接大量的外部链接,基本没有明确的主题内容,而有的网页则是由大量的其他网页链接而成。从某种意义上说,这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 有的网页主要链接大量的外部链接,基本没有明确的主题内容,而有的网页则是由大量的其他网页链接而成。从某种意义上说,这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分.
这篇文章的链接: 查看全部
浏览器抓取网页(关键词的提取和转载和修改再带来的便利性)
搜索引擎在抓取大量原创网页时,会进行预处理,主要包括四个方面,关键词的提取,“镜像网页”(网页内容完全一致)未经任何修改)或“转载网页”。”(近副本,主题内容基本相同但可能有一些额外的编辑信息等,转载的页面也称为“近似镜像页面”)消除,链接分析和页面的重要性计算。
提取1.关键词,取一个网页的源文件(比如通过浏览器的“查看源文件”功能),可以看出情况比较复杂。从知识和实践的角度来看,收录的关键词就是这个特性的最佳代表。因此,作为预处理阶段的一项基本任务,就是提取网页源文件内容部分收录的关键词。对于中文来说,就是使用所谓的“切字软件”,根据字典Σ从网页文本中剪出Σ中收录的单词。之后,一个网页主要由一组词来近似,p = {t1, t2, ..., tn}。一般来说,我们可能会得到很多词,而同一个词可能会在一个网页中出现多次。从有效性和效率的角度来看,所有的词都不应该出现在网页的表示中。“de”、“in”等没有表示意义的内容的词要去掉,称为“停用词”。”(停用词)。这样,对于一个网页来说,有效词的数量大约是 200 个。
2. 消除重复或转载网页,固有的数字化和网络化为网页的复制、转载和再版带来了便利,因此我们在网络上看到了大量的重复信息。这种现象对广大网民来说是积极的,因为有更多的机会获取信息。但对于搜索引擎来说,主要是负面的;不仅在采集网页时会消耗机器时间和网络带宽资源,而且如果出现在查询结果中,会毫无意义地消耗电脑屏幕资源,还会招来用户的抱怨,“这么多重复,给我一个就够了”。因此,剔除具有重复内容或主题内容的网页是搜索引擎在网页抓取阶段的一项重要工作。
3、链接分析,大量的HTML标签不仅给网页的预处理带来了一些麻烦,也带来了一些新的机会。从信息检索的角度来看,如果系统只处理内容的文本,我们可以依靠的是“shared bag of words”(共享词袋),即关键词@的集合> 收录在内容中,最多加上一个词条在文档集合中的词条频率(或tf,TF)和文档频率(document frequency 或df,DF)等统计信息。而 TF 和 DF 等频率信息可以在一定程度上表明词在文档中的相对重要性或某些内容的相关性,这是有意义的。使用 HTML 标签,情况可能会进一步改善,例如在同一个文档中,和之间的信息可能比和之间的信息更重要。特别是HTML文档中收录的其他文档的链接信息是近年来特别关注的对象,相信它们不仅给出了网页之间的关系,而且在判断网页内容方面也起着重要作用。页。
4、网页重要性的计算,搜索引擎其实追求的是一种统计意义上的满足感。人们认为谷歌目前比百度好,或者百度比谷歌好,参考取决于前者返回的内容在大多数情况下更符合用户的需求,但并非在所有情况下。查询结果的排序方式需要考虑很多因素。如何说一个网页比另一个网页更重要?人们引用科学文献重要性的评价方法,其核心思想是“被引用越多越重要”。通过 HTML 超链接,网页之间可以很好地体现“引用”的概念。PageRank,这是谷歌创造的核心技术,是这一理念的成功体现。此外,人们还注意到网页和文档的不同特点,即有的网页主要链接大量的外部链接,基本没有明确的主题内容,而其他网页则以链接方式链接。大量其他网页。从某种意义上说,这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 有的网页主要链接大量的外部链接,基本没有明确的主题内容,而有的网页则是由大量的其他网页链接而成。从某种意义上说,这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 有的网页主要链接大量的外部链接,基本没有明确的主题内容,而有的网页则是由大量的其他网页链接而成。从某种意义上说,这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分.
这篇文章的链接:
浏览器抓取网页(浏览器英语:HTTPS拦截证书的编码方式不一样(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2022-01-10 19:17
有一个问题,第一步是什么?
我当然要去官方网站找FAQ和帮助,先练英文
注意思路,burp提供der格式的证书,必须先导入浏览器,再从浏览器导出cer格式的证书
测试环境
[+] JDK1.8.0_162
[+] Burp Suite 1.7.26
一、打嗝介绍
请自行查看
在使用Burp站点拦截HTTPS的时候,他会提示你的连接不是私有连接或者这个连接不被信任等。这是因为burp一般默认只抓HTTP包。无法使用 HTTPS,因为它收录证书。正常爬取需要设置可信证书来抓取HTTPS数据包。
二、配置1、配置浏览器代理(目前支持:IE、Firefox、Chrome、Safari、iPhone、Android)
以Chrome为例:设置---->显示高级设置---->网络---->更改代理设置
--->点击局域网设置
--->输入后点击确定。
2、访问,下载burp的内置证书
--->下载后
证书为cacert.der,后缀为.der文件(证书的编码方式不同)。此文件不是常规的 .cer 证书文件。下面是让浏览器信任我们刚刚导出的证书。
3、导入证书
Chrome - 设置 - 高级 - HTTPS/SSL
--->点击Manage Certificates,所有浏览器都必须将PortSwiggerCA.crt证书安装到“Trusted Root Certification Authorities”中
--->点击导入
--->下一步
--->下一步
--->下一步
--->点击完成
--->刚才导入cacert.der文件,那么服务器中就会有一个类似“PortSwigger CA”(burp的内置证书)的证书,然后选择导出
--->下一步
--->下一步
--->下一步
4、相信这个证书
在证书颁发机构中导入刚才的PortSwiggerCA.crt文件,选择【信任使用此CA标志的网站】
--->点击导入
--->下一步
--->下一步
--->下一步
--->点击确定,然后重启,就这样,测试访问:
--->还有一种方法:
--->打开 Burp 站点
--->选择第一个选项并保存在本地
--->点击NEXT,然后找到证书并导入Chrome。 查看全部
浏览器抓取网页(浏览器英语:HTTPS拦截证书的编码方式不一样(图))
有一个问题,第一步是什么?
我当然要去官方网站找FAQ和帮助,先练英文
注意思路,burp提供der格式的证书,必须先导入浏览器,再从浏览器导出cer格式的证书
测试环境
[+] JDK1.8.0_162
[+] Burp Suite 1.7.26
一、打嗝介绍
请自行查看
在使用Burp站点拦截HTTPS的时候,他会提示你的连接不是私有连接或者这个连接不被信任等。这是因为burp一般默认只抓HTTP包。无法使用 HTTPS,因为它收录证书。正常爬取需要设置可信证书来抓取HTTPS数据包。

二、配置1、配置浏览器代理(目前支持:IE、Firefox、Chrome、Safari、iPhone、Android)
以Chrome为例:设置---->显示高级设置---->网络---->更改代理设置

--->点击局域网设置

--->输入后点击确定。
2、访问,下载burp的内置证书

--->下载后

证书为cacert.der,后缀为.der文件(证书的编码方式不同)。此文件不是常规的 .cer 证书文件。下面是让浏览器信任我们刚刚导出的证书。
3、导入证书
Chrome - 设置 - 高级 - HTTPS/SSL

--->点击Manage Certificates,所有浏览器都必须将PortSwiggerCA.crt证书安装到“Trusted Root Certification Authorities”中

--->点击导入

--->下一步

--->下一步

--->下一步

--->点击完成

--->刚才导入cacert.der文件,那么服务器中就会有一个类似“PortSwigger CA”(burp的内置证书)的证书,然后选择导出

--->下一步

--->下一步

--->下一步

4、相信这个证书
在证书颁发机构中导入刚才的PortSwiggerCA.crt文件,选择【信任使用此CA标志的网站】

--->点击导入

--->下一步

--->下一步

--->下一步

--->点击确定,然后重启,就这样,测试访问:

--->还有一种方法:
--->打开 Burp 站点

--->选择第一个选项并保存在本地


--->点击NEXT,然后找到证书并导入Chrome。
浏览器抓取网页(从IE浏览器获取当前页面内容可能有多种方式的介绍 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2022-01-10 17:19
)
从IE浏览器获取当前页面内容的方法可能有很多种,今天就介绍其中的一种。基本原理:鼠标点击当前IE页面时,获取鼠标的坐标位置,根据鼠标位置获取当前页面的句柄,然后根据句柄调用win32的东西获取页面内容。具体代码:
1 private void timer1_Tick(object sender, EventArgs e)
2 {
3 lock (currentLock)
4 {
5 System.Drawing.Point MousePoint = System.Windows.Forms.Form.MousePosition;
6 if (_leftClick)
7 {
8 timer1.Stop();
9 _leftClick = false;
10
11 _lastDocument = GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false));
12 if (_lastDocument != null)
13 {
14 if (_getDocument)
15 {
16 _getDocument = true;
17 try
18 {
19 string url = _lastDocument.url;
20 string html = _lastDocument.documentElement.outerHTML;
21 string cookie = _lastDocument.cookie;
22 string domain = _lastDocument.domain;
23
24 var resolveParams = new ResolveParam
25 {
26 Url = new Uri(url),
27 Html = html,
28 PageCookie = cookie,
29 Domain = domain
30 };
31
32 RequetResove(resolveParams);
33 }
34 catch (Exception ex)
35 {
36 System.Windows.MessageBox.Show(ex.Message);
37 Console.WriteLine(ex.Message);
38 Console.WriteLine(ex.StackTrace);
39 }
40 }
41 }
42 else
43 {
44 new MessageTip().Show("xx", "当前页面不是IE浏览器页面,或使用了非IE内核浏览器,如火狐,搜狗等。请使用IE浏览器打开网页");
45 }
46
47 _getDocument = false;
48 }
49 else
50 {
51 _pointFrm.Left = MousePoint.X + 10;
52 _pointFrm.Top = MousePoint.Y + 10;
53 }
54 }
55
56 }
在第11行GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false))的分解下,首先从鼠标坐标获取页面句柄:
1 public static IntPtr GetPointControl(System.Drawing.Point p, bool allControl)
2 {
3 IntPtr handle = Win32APIsFull.WindowFromPoint(p);
4 if (handle != IntPtr.Zero)
5 {
6 System.Drawing.Rectangle rect = default(System.Drawing.Rectangle);
7 if (Win32APIsFull.GetWindowRect(handle, out rect))
8 {
9 return Win32APIsFull.ChildWindowFromPointEx(handle, new System.Drawing.Point(p.X - rect.X, p.Y - rect.Y), allControl ? Win32APIsFull.CWP.ALL : Win32APIsFull.CWP.SKIPINVISIBLE);
10 }
11 }
12 return IntPtr.Zero;
13
14 }
接下来根据句柄获取页面内容:
1 public static HTMLDocument GetHTMLDocumentFormHwnd(IntPtr hwnd)
2 {
3 IntPtr result = Marshal.AllocHGlobal(4);
4 Object obj = null;
5
6 Console.WriteLine(Win32APIsFull.SendMessageTimeoutA(hwnd, HTML_GETOBJECT_mid, 0, 0, 2, 1000, result));
7 if (Marshal.ReadInt32(result) != 0)
8 {
9 Console.WriteLine(Win32APIsFull.ObjectFromLresult(Marshal.ReadInt32(result), ref IID_IHTMLDocument, 0, out obj));
10 }
11
12 Marshal.FreeHGlobal(result);
13
14 return obj as HTMLDocument;
15 }
一般原则:
向IE窗体发送消息,获取指向IE浏览器内存块的指针(非托管),然后根据该指针获取HTMLDocument对象。
该方法涉及win32的两个功能:
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "SendMessageTimeoutA")]
public static extern int SendMessageTimeoutA(
[InAttribute()] System.IntPtr hWnd,
uint Msg, uint wParam, int lParam,
uint fuFlags,
uint uTimeout,
System.IntPtr lpdwResult);
[System.Runtime.InteropServices.DllImportAttribute("oleacc.dll", EntryPoint = "ObjectFromLresult")]
public static extern int ObjectFromLresult(
int lResult,
ref Guid riid,
int wParam,
[MarshalAs(UnmanagedType.IDispatch), Out]
out Object pObject
); 查看全部
浏览器抓取网页(从IE浏览器获取当前页面内容可能有多种方式的介绍
)
从IE浏览器获取当前页面内容的方法可能有很多种,今天就介绍其中的一种。基本原理:鼠标点击当前IE页面时,获取鼠标的坐标位置,根据鼠标位置获取当前页面的句柄,然后根据句柄调用win32的东西获取页面内容。具体代码:
1 private void timer1_Tick(object sender, EventArgs e)
2 {
3 lock (currentLock)
4 {
5 System.Drawing.Point MousePoint = System.Windows.Forms.Form.MousePosition;
6 if (_leftClick)
7 {
8 timer1.Stop();
9 _leftClick = false;
10
11 _lastDocument = GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false));
12 if (_lastDocument != null)
13 {
14 if (_getDocument)
15 {
16 _getDocument = true;
17 try
18 {
19 string url = _lastDocument.url;
20 string html = _lastDocument.documentElement.outerHTML;
21 string cookie = _lastDocument.cookie;
22 string domain = _lastDocument.domain;
23
24 var resolveParams = new ResolveParam
25 {
26 Url = new Uri(url),
27 Html = html,
28 PageCookie = cookie,
29 Domain = domain
30 };
31
32 RequetResove(resolveParams);
33 }
34 catch (Exception ex)
35 {
36 System.Windows.MessageBox.Show(ex.Message);
37 Console.WriteLine(ex.Message);
38 Console.WriteLine(ex.StackTrace);
39 }
40 }
41 }
42 else
43 {
44 new MessageTip().Show("xx", "当前页面不是IE浏览器页面,或使用了非IE内核浏览器,如火狐,搜狗等。请使用IE浏览器打开网页");
45 }
46
47 _getDocument = false;
48 }
49 else
50 {
51 _pointFrm.Left = MousePoint.X + 10;
52 _pointFrm.Top = MousePoint.Y + 10;
53 }
54 }
55
56 }
在第11行GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false))的分解下,首先从鼠标坐标获取页面句柄:
1 public static IntPtr GetPointControl(System.Drawing.Point p, bool allControl)
2 {
3 IntPtr handle = Win32APIsFull.WindowFromPoint(p);
4 if (handle != IntPtr.Zero)
5 {
6 System.Drawing.Rectangle rect = default(System.Drawing.Rectangle);
7 if (Win32APIsFull.GetWindowRect(handle, out rect))
8 {
9 return Win32APIsFull.ChildWindowFromPointEx(handle, new System.Drawing.Point(p.X - rect.X, p.Y - rect.Y), allControl ? Win32APIsFull.CWP.ALL : Win32APIsFull.CWP.SKIPINVISIBLE);
10 }
11 }
12 return IntPtr.Zero;
13
14 }
接下来根据句柄获取页面内容:
1 public static HTMLDocument GetHTMLDocumentFormHwnd(IntPtr hwnd)
2 {
3 IntPtr result = Marshal.AllocHGlobal(4);
4 Object obj = null;
5
6 Console.WriteLine(Win32APIsFull.SendMessageTimeoutA(hwnd, HTML_GETOBJECT_mid, 0, 0, 2, 1000, result));
7 if (Marshal.ReadInt32(result) != 0)
8 {
9 Console.WriteLine(Win32APIsFull.ObjectFromLresult(Marshal.ReadInt32(result), ref IID_IHTMLDocument, 0, out obj));
10 }
11
12 Marshal.FreeHGlobal(result);
13
14 return obj as HTMLDocument;
15 }
一般原则:

向IE窗体发送消息,获取指向IE浏览器内存块的指针(非托管),然后根据该指针获取HTMLDocument对象。
该方法涉及win32的两个功能:
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "SendMessageTimeoutA")]
public static extern int SendMessageTimeoutA(
[InAttribute()] System.IntPtr hWnd,
uint Msg, uint wParam, int lParam,
uint fuFlags,
uint uTimeout,
System.IntPtr lpdwResult);
[System.Runtime.InteropServices.DllImportAttribute("oleacc.dll", EntryPoint = "ObjectFromLresult")]
public static extern int ObjectFromLresult(
int lResult,
ref Guid riid,
int wParam,
[MarshalAs(UnmanagedType.IDispatch), Out]
out Object pObject
);
浏览器抓取网页(PYTHON的安装(已安装,可跳过此步骤))
网站优化 • 优采云 发表了文章 • 0 个评论 • 121 次浏览 • 2022-01-09 15:03
(一)PYTHON安装(已经安装,可以跳过此步)
1、PYTHON下载
PYTHON官网:
根据对应系统下载,这里是window系统,点击windows,根据自己系统的操作位数下载
添加环境变量:
如果没有添加,可以自己在电脑上添加
(二)安装第三方库
安装selenium和pyquery,cmd命令下输入pip install selenium(pyquery安装类似)
如果报错,进入python目录下的scripts目录,然后输入命令
如果python的IDLE下没有报错,说明安装成功
(三)浏览器及对应浏览器驱动的安装
这里主要使用chrome浏览器,去谷歌官网下载安装,安装后查看谷歌版本,点击关于谷歌浏览器
(通常在这里找到)
我的版本:67.0
下载对应的webdriver(这里没有人推测每3个版本对应一个v65-67---v2.38,即v68-70--v2.39)
下载链接:
将下载好的chromedriver.exe解压,放到python36目录下(或者python36目录下的脚本)
IDLE下执行以下代码,会自动打开你的谷歌浏览器(环境搭建)
(四)详细示例代码
需求:爬取股票网站信息((“好”或“坏”)和“相关股票”),点击加载更多
(1)打开浏览器获取相关信息:
(2)网页分析(selenium有很多定位方式,这里用的比较少)
上述代码中,data已经拥有了网页当前页面的所有内容(可以输出观察);我们现在只需要从中获取我们想要的数据
在网页中,右键,检查元素,(或检查)分析网页:(由于获取的数据可能与网页分析的数据不同,建议输出数据并分析正则表达式从数据)
我们使用正则表达式查找所有以 1 开头并以 2 结尾的内容并使用 findall 函数
实现点击:(点击后“好股”和“相关股”的规律会与首页不同(后期点击与第一次点击相同))
定位方法如下:(用的比较少,这里就不详细介绍了,大家自己理解):
当您知道元素的 id 属性时使用 find_element_by_id 。使用此策略,将返回 id 属性值与位置匹配的第一个元素。
当您知道元素的名称属性时使用 find_element_by_name。使用此策略,将返回 id 属性值与位置匹配的第一个元素。
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
附上源代码:
#coding=utf-8
from selenium import webdriver
import time
import re
from pyquery import PyQuery as pq
def openurl(url,num):
browser = webdriver.Chrome() #打开浏览器
browser.get(url) #进入相关网站
html=browser.page_source #获取网站源码
data=str(pq(html)) #str() 函数将对象转化为适于人阅读的形式。
dic={}
re_rule=r'(.*?)'
datalist=re.findall(re_rule,data,re.S)
for i in range(0,len(datalist)):
rule1=r'/img/icon-lihao.png(.*?)'
bullish = re.findall(rule1,datalist[i],re.S)
if len(bullish)==0:
rule1=r'/img/icon-likong.png(.*?)'
bullish = re.findall(rule1,datalist[i],re.S)
rule2=r'(.*?)'
stock_name=re.findall(rule2,datalist[i], re.S)
if len(stock_name) > 0 and len( bullish) > 0:
for c in range(0,len(stock_name)):
dic[stock_name[c]]= bullish[0]
print("正在爬取第",len(dic)+1,"个请稍等.....")
c=len(datalist)
if len(dic) < num:
while(1):
browser.find_element_by_class_name("home-news-footer").click()
time.sleep(1)
html=browser.page_source
data=str(pq(html))
datalist=re.findall(re_rule,data,re.S)
for i in range(c,len(datalist)):
rule3=r'/img/icon-lihao.png(.*?)'
bullish = re.findall(rule3,datalist[i],re.S)
if len(bullish)==0:
rule5=r'/img/icon-likong.png(.*?)'
bullish = re.findall(rule5,datalist[i],re.S)
rule4=r'(.*?)'
stock_name=re.findall(rule4,datalist[i], re.S)
if len(stock_name) > 0 and len( bullish) > 0:
for c in range(0,len(stock_name)):
dic[stock_name[c]]= bullish[0]
c=len(datalist)
if len(dic) > num :
browser.quit()
print("爬取完毕!!")
break
print("正在爬取第",len(dic)+1,"个请稍等.....")
else:
browser.quit()
print("爬取完毕!!")
return dic
url='https://www.xuangubao.cn/'
dict=openurl(url,3)
print(dict)
#f=open("F:\\text.txt","a")
#for key,values in dict.items():
#f.write((key+"\t"))
#print(key,values)
#f.close()
---------------------
原来的: 查看全部
浏览器抓取网页(PYTHON的安装(已安装,可跳过此步骤))
(一)PYTHON安装(已经安装,可以跳过此步)
1、PYTHON下载
PYTHON官网:
根据对应系统下载,这里是window系统,点击windows,根据自己系统的操作位数下载
添加环境变量:
如果没有添加,可以自己在电脑上添加
(二)安装第三方库
安装selenium和pyquery,cmd命令下输入pip install selenium(pyquery安装类似)
如果报错,进入python目录下的scripts目录,然后输入命令
如果python的IDLE下没有报错,说明安装成功
(三)浏览器及对应浏览器驱动的安装
这里主要使用chrome浏览器,去谷歌官网下载安装,安装后查看谷歌版本,点击关于谷歌浏览器
(通常在这里找到)
我的版本:67.0
下载对应的webdriver(这里没有人推测每3个版本对应一个v65-67---v2.38,即v68-70--v2.39)
下载链接:
将下载好的chromedriver.exe解压,放到python36目录下(或者python36目录下的脚本)
IDLE下执行以下代码,会自动打开你的谷歌浏览器(环境搭建)
(四)详细示例代码
需求:爬取股票网站信息((“好”或“坏”)和“相关股票”),点击加载更多
(1)打开浏览器获取相关信息:
(2)网页分析(selenium有很多定位方式,这里用的比较少)
上述代码中,data已经拥有了网页当前页面的所有内容(可以输出观察);我们现在只需要从中获取我们想要的数据
在网页中,右键,检查元素,(或检查)分析网页:(由于获取的数据可能与网页分析的数据不同,建议输出数据并分析正则表达式从数据)
我们使用正则表达式查找所有以 1 开头并以 2 结尾的内容并使用 findall 函数
实现点击:(点击后“好股”和“相关股”的规律会与首页不同(后期点击与第一次点击相同))
定位方法如下:(用的比较少,这里就不详细介绍了,大家自己理解):
当您知道元素的 id 属性时使用 find_element_by_id 。使用此策略,将返回 id 属性值与位置匹配的第一个元素。
当您知道元素的名称属性时使用 find_element_by_name。使用此策略,将返回 id 属性值与位置匹配的第一个元素。
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
附上源代码:
#coding=utf-8
from selenium import webdriver
import time
import re
from pyquery import PyQuery as pq
def openurl(url,num):
browser = webdriver.Chrome() #打开浏览器
browser.get(url) #进入相关网站
html=browser.page_source #获取网站源码
data=str(pq(html)) #str() 函数将对象转化为适于人阅读的形式。
dic={}
re_rule=r'(.*?)'
datalist=re.findall(re_rule,data,re.S)
for i in range(0,len(datalist)):
rule1=r'/img/icon-lihao.png(.*?)'
bullish = re.findall(rule1,datalist[i],re.S)
if len(bullish)==0:
rule1=r'/img/icon-likong.png(.*?)'
bullish = re.findall(rule1,datalist[i],re.S)
rule2=r'(.*?)'
stock_name=re.findall(rule2,datalist[i], re.S)
if len(stock_name) > 0 and len( bullish) > 0:
for c in range(0,len(stock_name)):
dic[stock_name[c]]= bullish[0]
print("正在爬取第",len(dic)+1,"个请稍等.....")
c=len(datalist)
if len(dic) < num:
while(1):
browser.find_element_by_class_name("home-news-footer").click()
time.sleep(1)
html=browser.page_source
data=str(pq(html))
datalist=re.findall(re_rule,data,re.S)
for i in range(c,len(datalist)):
rule3=r'/img/icon-lihao.png(.*?)'
bullish = re.findall(rule3,datalist[i],re.S)
if len(bullish)==0:
rule5=r'/img/icon-likong.png(.*?)'
bullish = re.findall(rule5,datalist[i],re.S)
rule4=r'(.*?)'
stock_name=re.findall(rule4,datalist[i], re.S)
if len(stock_name) > 0 and len( bullish) > 0:
for c in range(0,len(stock_name)):
dic[stock_name[c]]= bullish[0]
c=len(datalist)
if len(dic) > num :
browser.quit()
print("爬取完毕!!")
break
print("正在爬取第",len(dic)+1,"个请稍等.....")
else:
browser.quit()
print("爬取完毕!!")
return dic
url='https://www.xuangubao.cn/'
dict=openurl(url,3)
print(dict)
#f=open("F:\\text.txt","a")
#for key,values in dict.items():
#f.write((key+"\t"))
#print(key,values)
#f.close()
---------------------
原来的:
浏览器抓取网页(Python中urllib库Python2系列使用的步骤和访问步骤 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2022-01-09 15:03
)
一:爬取一个简单的页面:
用Python做爬虫网站这个功能很强大。今天尝试抓取百度主页,非常成功。让我们看一下步骤。
首先你需要准备工具:
1.python:我比较喜欢用新东西,所以用Python3.6、python下载地址:
2.开发工具:可以使用Python编译器(小),但是因为之前一直在做前端,使用webstrom,所以选择JetBrains的PyCharm,下载地址:%E4%B8%8B%E8 %BD%BD
3.Fiddler——一个网页请求监控工具,我们可以用它来了解用户触发网页请求后发生的详细步骤;(从百度下载)
理解 Python 中的 urllib 库
Python2系列使用urllib2,在Python3之后会集成到urllib中。
在 2:
urllib2.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urllib2.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
3 是
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
#这个函数看起来接受很多的参数啊,不过很多我们平时不会用到,用到的url居多。
显然,我使用后者
简单的爬虫代码
#encoding:UTF-8
import urllib.request
url = "https://www.douban.com/ "
data = urllib.request.urlopen(url).read()
data = data.decode('UTF-8')
print(data)
效果如下:
二:抓取需要伪装浏览器的网站
但是一个小小的百度主页怎么能满足我,于是想到了一些需要伪装浏览器去抓取的网站,比如豆瓣,
1.假浏览器:
对于一些需要登录的网站,如果请求不是来自浏览器,则不会收到响应。因此,我们需要将爬虫发出的请求伪装成浏览器的正规军。
具体实现:自定义网页请求头。
2.,使用Fiddler查看请求和响应头
打开工具Fiddler,然后在浏览器中访问“”。在Fiddler左侧的访问记录中,找到“200 HTTPS”条目,点击查看对应的请求头和响应头的具体内容:
3.访问:
import urllib.request
import ssl
ssl._create_default_https_context = ssl._create_stdlib_context
# 定义保存函数
def saveFile(data):
path = "F:\\pachong\\02_douban.out"
f = open(path, 'wb')
f.write(data)
f.close()
# 网址
url = "https://www.douban.com/"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/51.0.2704.63 Safari/537.36'}
req = urllib.request.Request(url=url, headers=headers)
res = urllib.request.urlopen(req)
data = res.read()
# 也可以把爬取的内容保存到文件中
saveFile(data)
data = data.decode('utf-8')
# 打印抓取的内容
print(data)
# 打印爬取网页的各类信息
print(type(res))
print(res.geturl())
print(res.info())
print(res.getcode())
让我们看一下这段代码:
import ssl
ssl._create_default_https_context = ssl._create_stdlib_context 查看全部
浏览器抓取网页(Python中urllib库Python2系列使用的步骤和访问步骤
)
一:爬取一个简单的页面:
用Python做爬虫网站这个功能很强大。今天尝试抓取百度主页,非常成功。让我们看一下步骤。
首先你需要准备工具:
1.python:我比较喜欢用新东西,所以用Python3.6、python下载地址:
2.开发工具:可以使用Python编译器(小),但是因为之前一直在做前端,使用webstrom,所以选择JetBrains的PyCharm,下载地址:%E4%B8%8B%E8 %BD%BD
3.Fiddler——一个网页请求监控工具,我们可以用它来了解用户触发网页请求后发生的详细步骤;(从百度下载)
理解 Python 中的 urllib 库
Python2系列使用urllib2,在Python3之后会集成到urllib中。
在 2:
urllib2.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urllib2.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
3 是
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
#这个函数看起来接受很多的参数啊,不过很多我们平时不会用到,用到的url居多。
显然,我使用后者
简单的爬虫代码
#encoding:UTF-8
import urllib.request
url = "https://www.douban.com/ "
data = urllib.request.urlopen(url).read()
data = data.decode('UTF-8')
print(data)
效果如下:

二:抓取需要伪装浏览器的网站
但是一个小小的百度主页怎么能满足我,于是想到了一些需要伪装浏览器去抓取的网站,比如豆瓣,
1.假浏览器:
对于一些需要登录的网站,如果请求不是来自浏览器,则不会收到响应。因此,我们需要将爬虫发出的请求伪装成浏览器的正规军。
具体实现:自定义网页请求头。
2.,使用Fiddler查看请求和响应头
打开工具Fiddler,然后在浏览器中访问“”。在Fiddler左侧的访问记录中,找到“200 HTTPS”条目,点击查看对应的请求头和响应头的具体内容:

3.访问:
import urllib.request
import ssl
ssl._create_default_https_context = ssl._create_stdlib_context
# 定义保存函数
def saveFile(data):
path = "F:\\pachong\\02_douban.out"
f = open(path, 'wb')
f.write(data)
f.close()
# 网址
url = "https://www.douban.com/"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/51.0.2704.63 Safari/537.36'}
req = urllib.request.Request(url=url, headers=headers)
res = urllib.request.urlopen(req)
data = res.read()
# 也可以把爬取的内容保存到文件中
saveFile(data)
data = data.decode('utf-8')
# 打印抓取的内容
print(data)
# 打印爬取网页的各类信息
print(type(res))
print(res.geturl())
print(res.info())
print(res.getcode())
让我们看一下这段代码:
import ssl
ssl._create_default_https_context = ssl._create_stdlib_context
浏览器抓取网页(网页浏览器主要通过HTTP协议连接网页伺服器而取得(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2022-01-08 08:06
Web浏览器主要通过HTTP协议连接Web服务器获取网页。HTTP 允许网络浏览器向网络服务器发送数据并获取网页。目前最常用的HTTP是HTTP/1.1,在RFC2616中有完整的定义。HTTP/1.1 有自己的一套标准,Internet Explorer 不完全支持,但是许多其他当代 Web 浏览器完全支持这些标准。
网页的位置由 URL(Uniform Resource Locator)表示,即网页的地址;以http:开头的一种是通过HTTP协议登录。许多浏览器还支持其他类型的 URL 和协议,例如 ftp:用于 FTP(文件传输协议)、gopher:用于 Gopher 和 https:用于 HTTPS(SSL 加密的 HTTP)。
网页通常使用超文本标记语言(标准通用标记语言下的应用程序)文件格式,并在 HTTP 协议中定义为 MIME 内容。大多数浏览器支持 HTML 以外的许多文件格式,例如 JPEG、PNG 和 GIF 图像格式,并且可以使用插件支持其他文件类型。通过结合 HTTP 内容类型和 URL 协议,网页设计者可以在网页中收录图像、动画、视频、声音和流媒体,或者允许人们通过网页访问它们。
早期的网络浏览器只支持 HTML 的简化版本。专有软件浏览器的快速发展导致了非标准 HTML 代码的产生。这会导致浏览器兼容性问题。现代浏览器(Mozilla、Opera 和 Safari)支持标准 HTML 和 XHTML(从 HTML 4.01 开始)。它们都显示相同的页面效果。Internet Explorer 仍然不完全支持 HTML 4.01 和 XHTML 1.x。现在很多网站都是使用WYSIWYG HTML编辑软件构建的,包括Macromedia Dreamweaver和Microsoft Frontpage。他们通常默认生成非标准的 HTML;这阻止了 W3C 开发统一标准,尤其是 XHTML 和 CSS(级联样式表,在设计网页时使用)。
一些浏览器还为 Usenet 新闻组、IRC(Internet 中继聊天)和电子邮件加载了附加组件。支持的协议包括 NNTP(网络新闻传输协议)、SMTP(简单邮件传输协议)、IMAP(交互式邮件访问协议)和 POP(邮局协议)。 查看全部
浏览器抓取网页(网页浏览器主要通过HTTP协议连接网页伺服器而取得(图))
Web浏览器主要通过HTTP协议连接Web服务器获取网页。HTTP 允许网络浏览器向网络服务器发送数据并获取网页。目前最常用的HTTP是HTTP/1.1,在RFC2616中有完整的定义。HTTP/1.1 有自己的一套标准,Internet Explorer 不完全支持,但是许多其他当代 Web 浏览器完全支持这些标准。
网页的位置由 URL(Uniform Resource Locator)表示,即网页的地址;以http:开头的一种是通过HTTP协议登录。许多浏览器还支持其他类型的 URL 和协议,例如 ftp:用于 FTP(文件传输协议)、gopher:用于 Gopher 和 https:用于 HTTPS(SSL 加密的 HTTP)。
网页通常使用超文本标记语言(标准通用标记语言下的应用程序)文件格式,并在 HTTP 协议中定义为 MIME 内容。大多数浏览器支持 HTML 以外的许多文件格式,例如 JPEG、PNG 和 GIF 图像格式,并且可以使用插件支持其他文件类型。通过结合 HTTP 内容类型和 URL 协议,网页设计者可以在网页中收录图像、动画、视频、声音和流媒体,或者允许人们通过网页访问它们。
早期的网络浏览器只支持 HTML 的简化版本。专有软件浏览器的快速发展导致了非标准 HTML 代码的产生。这会导致浏览器兼容性问题。现代浏览器(Mozilla、Opera 和 Safari)支持标准 HTML 和 XHTML(从 HTML 4.01 开始)。它们都显示相同的页面效果。Internet Explorer 仍然不完全支持 HTML 4.01 和 XHTML 1.x。现在很多网站都是使用WYSIWYG HTML编辑软件构建的,包括Macromedia Dreamweaver和Microsoft Frontpage。他们通常默认生成非标准的 HTML;这阻止了 W3C 开发统一标准,尤其是 XHTML 和 CSS(级联样式表,在设计网页时使用)。
一些浏览器还为 Usenet 新闻组、IRC(Internet 中继聊天)和电子邮件加载了附加组件。支持的协议包括 NNTP(网络新闻传输协议)、SMTP(简单邮件传输协议)、IMAP(交互式邮件访问协议)和 POP(邮局协议)。
浏览器抓取网页( 第11行GetHTMLDocumentFormHwnd获取浏览器页面内容的资料及详细内容)
网站优化 • 优采云 发表了文章 • 0 个评论 • 42 次浏览 • 2022-01-08 08:04
第11行GetHTMLDocumentFormHwnd获取浏览器页面内容的资料及详细内容)
private void timer1_Tick(object sender, EventArgs e)
{
lock (currentLock)
{
System.Drawing.Point MousePoint = System.Windows.Forms.Form.MousePosition;
if (_leftClick)
{
timer1.Stop();
_leftClick = false;
_lastDocument = GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false));
if (_lastDocument != null)
{
if (_getDocument)
{
_getDocument = true;
try
{
string url = _lastDocument.url;
string html = _lastDocument.documentElement.outerHTML;
string cookie = _lastDocument.cookie;
string domain = _lastDocument.domain;
var resolveParams = new ResolveParam
{
Url = new Uri(url),
Html = html,
PageCookie = cookie,
Domain = domain
};
RequetResove(resolveParams);
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
}
}
else
{
new MessageTip().Show("xx", "当前页面不是IE浏览器页面,或使用了非IE内核浏览器,如火狐,搜狗等。请使用IE浏览器打开网页");
}
_getDocument = false;
}
else
{
_pointFrm.Left = MousePoint.X + 10;
_pointFrm.Top = MousePoint.Y + 10;
}
}
}
第11行的GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false))分解,首先从鼠标坐标中获取页面的句柄:
public static IntPtr GetPointControl(System.Drawing.Point p, bool allControl)
{
IntPtr handle = Win32APIsFull.WindowFromPoint(p);
if (handle != IntPtr.Zero)
{
System.Drawing.Rectangle rect = default(System.Drawing.Rectangle);
if (Win32APIsFull.GetWindowRect(handle, out rect))
{
return Win32APIsFull.ChildWindowFromPointEx(handle, new System.Drawing.Point(p.X - rect.X, p.Y - rect.Y), allControl ? Win32APIsFull.CWP.ALL : Win32APIsFull.CWP.SKIPINVISIBLE);
}
}
return IntPtr.Zero;
}
接下来,根据句柄获取页面内容:
public static HTMLDocument GetHTMLDocumentFormHwnd(IntPtr hwnd)
{
IntPtr result = Marshal.AllocHGlobal(4);
Object obj = null;
Console.WriteLine(Win32APIsFull.SendMessageTimeoutA(hwnd, HTML_GETOBJECT_mid, 0, 0, 2, 1000, result));
if (Marshal.ReadInt32(result) != 0)
{
Console.WriteLine(Win32APIsFull.ObjectFromLresult(Marshal.ReadInt32(result), ref IID_IHTMLDocument, 0, out obj));
}
Marshal.FreeHGlobal(result);
return obj as HTMLDocument;
}
一般原则:
向IE窗体发送消息,获取指向IE浏览器的某个内存块(非托管)的指针,然后根据这个指针获取HTMLDocument对象。
该方法涉及win32的两个功能:
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "SendMessageTimeoutA")]
public static extern int SendMessageTimeoutA(
[InAttribute()] System.IntPtr hWnd,
uint Msg, uint wParam, int lParam,
uint fuFlags,
uint uTimeout,
System.IntPtr lpdwResult);
[System.Runtime.InteropServices.DllImportAttribute("oleacc.dll", EntryPoint = "ObjectFromLresult")]
public static extern int ObjectFromLresult(
int lResult,
ref Guid riid,
int wParam,
[MarshalAs(UnmanagedType.IDispatch), Out]
out Object pObject
);
以上就是c#从IE浏览器获取当前页面内容的详细内容。更多关于c#获取浏览器页面内容的内容,请关注云海天教程中其他相关话题文章! 查看全部
浏览器抓取网页(
第11行GetHTMLDocumentFormHwnd获取浏览器页面内容的资料及详细内容)
private void timer1_Tick(object sender, EventArgs e)
{
lock (currentLock)
{
System.Drawing.Point MousePoint = System.Windows.Forms.Form.MousePosition;
if (_leftClick)
{
timer1.Stop();
_leftClick = false;
_lastDocument = GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false));
if (_lastDocument != null)
{
if (_getDocument)
{
_getDocument = true;
try
{
string url = _lastDocument.url;
string html = _lastDocument.documentElement.outerHTML;
string cookie = _lastDocument.cookie;
string domain = _lastDocument.domain;
var resolveParams = new ResolveParam
{
Url = new Uri(url),
Html = html,
PageCookie = cookie,
Domain = domain
};
RequetResove(resolveParams);
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
}
}
else
{
new MessageTip().Show("xx", "当前页面不是IE浏览器页面,或使用了非IE内核浏览器,如火狐,搜狗等。请使用IE浏览器打开网页");
}
_getDocument = false;
}
else
{
_pointFrm.Left = MousePoint.X + 10;
_pointFrm.Top = MousePoint.Y + 10;
}
}
}
第11行的GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false))分解,首先从鼠标坐标中获取页面的句柄:
public static IntPtr GetPointControl(System.Drawing.Point p, bool allControl)
{
IntPtr handle = Win32APIsFull.WindowFromPoint(p);
if (handle != IntPtr.Zero)
{
System.Drawing.Rectangle rect = default(System.Drawing.Rectangle);
if (Win32APIsFull.GetWindowRect(handle, out rect))
{
return Win32APIsFull.ChildWindowFromPointEx(handle, new System.Drawing.Point(p.X - rect.X, p.Y - rect.Y), allControl ? Win32APIsFull.CWP.ALL : Win32APIsFull.CWP.SKIPINVISIBLE);
}
}
return IntPtr.Zero;
}
接下来,根据句柄获取页面内容:
public static HTMLDocument GetHTMLDocumentFormHwnd(IntPtr hwnd)
{
IntPtr result = Marshal.AllocHGlobal(4);
Object obj = null;
Console.WriteLine(Win32APIsFull.SendMessageTimeoutA(hwnd, HTML_GETOBJECT_mid, 0, 0, 2, 1000, result));
if (Marshal.ReadInt32(result) != 0)
{
Console.WriteLine(Win32APIsFull.ObjectFromLresult(Marshal.ReadInt32(result), ref IID_IHTMLDocument, 0, out obj));
}
Marshal.FreeHGlobal(result);
return obj as HTMLDocument;
}
一般原则:

向IE窗体发送消息,获取指向IE浏览器的某个内存块(非托管)的指针,然后根据这个指针获取HTMLDocument对象。
该方法涉及win32的两个功能:
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "SendMessageTimeoutA")]
public static extern int SendMessageTimeoutA(
[InAttribute()] System.IntPtr hWnd,
uint Msg, uint wParam, int lParam,
uint fuFlags,
uint uTimeout,
System.IntPtr lpdwResult);
[System.Runtime.InteropServices.DllImportAttribute("oleacc.dll", EntryPoint = "ObjectFromLresult")]
public static extern int ObjectFromLresult(
int lResult,
ref Guid riid,
int wParam,
[MarshalAs(UnmanagedType.IDispatch), Out]
out Object pObject
);
以上就是c#从IE浏览器获取当前页面内容的详细内容。更多关于c#获取浏览器页面内容的内容,请关注云海天教程中其他相关话题文章!
浏览器抓取网页(UserUA字串的含义及含义有哪些?Agent含义)
网站优化 • 优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2021-12-30 12:05
一、用户代理的含义
User Agent的中文名称是User Agent,简称UA。它是一个特殊的字符串头,使服务器能够识别操作系统和版本、CPU 类型、客户端使用的浏览器和版本、浏览器渲染引擎、浏览器语言和浏览器插件等。
有的网站往往通过对UA的判断,将不同的页面发送到不同的操作系统、不同的浏览器,所以有些页面在某个浏览器中可能无法正常显示,但可以通过伪装UA来绕过检测。
浏览器的UA字符串
标准格式为:浏览器标识(操作系统标识;加密级别标识;浏览器语言)渲染引擎标识版本信息
浏览器 ID
由于很多网站在进行UA检测时忽略了两位数的版本号,可能会导致浏览器及更高版本收到不良页面。因此,浏览器10以后版本中的浏览器标识项固定为浏览器。将实际版本信息添加到 UA 字符串的末尾。
注:来自百度百科
当浏览器发起请求时,我们可以查看请求信息。
请求头:请求头将收录
请求信息。
2:在浏览器请求头中获取User-Agent
(1) 请求
String userAgent = request.getHeader("user-agent");
(2)获取
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
三、UserAgentUtils.jar
UserAgentUtils.jar 是 UserAgent 的工具类。
(1)maven
eu.bitwalker
UserAgentUtils
1.20
(2)java 代码
UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
Browser browser = userAgent.getBrowser();
OperatingSystem os = userAgent.getOperatingSystem();
参考文章: 查看全部
浏览器抓取网页(UserUA字串的含义及含义有哪些?Agent含义)
一、用户代理的含义
User Agent的中文名称是User Agent,简称UA。它是一个特殊的字符串头,使服务器能够识别操作系统和版本、CPU 类型、客户端使用的浏览器和版本、浏览器渲染引擎、浏览器语言和浏览器插件等。
有的网站往往通过对UA的判断,将不同的页面发送到不同的操作系统、不同的浏览器,所以有些页面在某个浏览器中可能无法正常显示,但可以通过伪装UA来绕过检测。
浏览器的UA字符串
标准格式为:浏览器标识(操作系统标识;加密级别标识;浏览器语言)渲染引擎标识版本信息
浏览器 ID
由于很多网站在进行UA检测时忽略了两位数的版本号,可能会导致浏览器及更高版本收到不良页面。因此,浏览器10以后版本中的浏览器标识项固定为浏览器。将实际版本信息添加到 UA 字符串的末尾。
注:来自百度百科
当浏览器发起请求时,我们可以查看请求信息。

请求头:请求头将收录
请求信息。
2:在浏览器请求头中获取User-Agent
(1) 请求
String userAgent = request.getHeader("user-agent");
(2)获取
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
三、UserAgentUtils.jar
UserAgentUtils.jar 是 UserAgent 的工具类。
(1)maven
eu.bitwalker
UserAgentUtils
1.20
(2)java 代码
UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
Browser browser = userAgent.getBrowser();
OperatingSystem os = userAgent.getOperatingSystem();
参考文章:
浏览器抓取网页(如何快速收录网站不收录怎么办?(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-12-29 17:16
经常有同学说怎么快速收录,网站不收录怎么办?
实际上,未收录
的站点通常是新站点。对于没有SEO基础,对SEO没有深入了解的小伙伴,经常会遇到问题。很多人甚至会告诉你,如果不收录,就会吸引网站流量,吸引蜘蛛来爬你。页。这些想法和操作都太片面了。
网站不包括:首先确定是刚上线1-3个月的新网站,还是半年多的老网站
如果是新网站:
主页在上线后1周内需要10-20天的时间采集
,大量的内部记录被采集
、搜索和发布。如果网站有很多空白页面,大量页面的内容是非常少的。在这种情况下,相应的页面不包括在内,否则索引会很慢。如果该网站超过20天未出现在首页,则该网站的域名可能会被搜索引擎屏蔽。您可以提交投诉以搜索 #1
老网站不收录,新增的页面大多没有内页搜索,多为页面质量问题。
本站不收录
常规分析思路
1、网站服务器必须稳定。在百度资源网站的管理信息中,抓取异常,可以看出服务器的稳定性。
2、检查robots.txt文件是否允许爬取。例如,网站首页和各版块页面是否被拦截抓取。
3、检查网站每个页面的路径是否良好。比如检查太多不利于集合调用的次数,以及site: website检查是否有动态和静态共存的路径
4、 重要页面不能用JS标签写。如:首页导航、版块样式、各版块页面块模型、内部页面版块不能写在JS标签中,看不懂代码的用户可以使用谷歌浏览器设置为不允许javascript抓取,然后刷新后看页面。效果,JS部分无法显示,显示效果
5、页面稳定,质量好。网站页面版块链接合理,内容质量好,页面无频繁变化,采集
来源不多,无用户搜索需求。
如果以上都没有问题,分析一下人为的变化因素
分析近三个月人为操作变化,内页内容未大量采集。例如,大量页面被删除,页面标题被修改,程序和网站模块频繁更改,甚至网站被搜索引擎降级,导致许多内部页面没有被收录。对内容的大量改动以及在内容中放置大量的广告链接弹窗都会导致新页面不被收录。
如何加快网站收录?
1、 主动推送链接:更新站点地图,提交给搜索引擎,在百度资源验证网站安装自动推送代码,添加页面抓取。
2、 做好网站内容丰富度优化:关注长尾关键词排名布局,做更多用户会搜索的内容,文章和正文,内容不少于500字,图片3张左右,图片和 可以给用户思考,图片要加上ATL关键词,让搜索引擎知道图片的意思,内容要收录
关键词主题用户将搜索。
3、引导百度蜘蛛抓取:到百度蜘蛛活跃度高的网站和论坛,获取一些导航网站链接,换取几个优质好友链接,加速网站抓取和收录。
4、关注搜索反馈:如果长时间没有收录,可以向搜索引擎投诉反馈。如本文图1所示
5、开熊掌:熊掌对优质内容有原创保护,优质原创内容将在优质原创内容的采集
和展示方面给予优惠
6、链接传播与分享:从营销角度提升品牌搜索量。培养用户忠诚度,增加网站用户采集
,分享文章链接,频繁互动回访。这些操作将有助于提高搜索抓取的频率、推动页面更新并提高整体网站的包容性。 查看全部
浏览器抓取网页(如何快速收录网站不收录怎么办?(图))
经常有同学说怎么快速收录,网站不收录怎么办?
实际上,未收录
的站点通常是新站点。对于没有SEO基础,对SEO没有深入了解的小伙伴,经常会遇到问题。很多人甚至会告诉你,如果不收录,就会吸引网站流量,吸引蜘蛛来爬你。页。这些想法和操作都太片面了。
网站不包括:首先确定是刚上线1-3个月的新网站,还是半年多的老网站
如果是新网站:
主页在上线后1周内需要10-20天的时间采集
,大量的内部记录被采集
、搜索和发布。如果网站有很多空白页面,大量页面的内容是非常少的。在这种情况下,相应的页面不包括在内,否则索引会很慢。如果该网站超过20天未出现在首页,则该网站的域名可能会被搜索引擎屏蔽。您可以提交投诉以搜索 #1
老网站不收录,新增的页面大多没有内页搜索,多为页面质量问题。
本站不收录
常规分析思路
1、网站服务器必须稳定。在百度资源网站的管理信息中,抓取异常,可以看出服务器的稳定性。
2、检查robots.txt文件是否允许爬取。例如,网站首页和各版块页面是否被拦截抓取。
3、检查网站每个页面的路径是否良好。比如检查太多不利于集合调用的次数,以及site: website检查是否有动态和静态共存的路径
4、 重要页面不能用JS标签写。如:首页导航、版块样式、各版块页面块模型、内部页面版块不能写在JS标签中,看不懂代码的用户可以使用谷歌浏览器设置为不允许javascript抓取,然后刷新后看页面。效果,JS部分无法显示,显示效果
5、页面稳定,质量好。网站页面版块链接合理,内容质量好,页面无频繁变化,采集
来源不多,无用户搜索需求。
如果以上都没有问题,分析一下人为的变化因素
分析近三个月人为操作变化,内页内容未大量采集。例如,大量页面被删除,页面标题被修改,程序和网站模块频繁更改,甚至网站被搜索引擎降级,导致许多内部页面没有被收录。对内容的大量改动以及在内容中放置大量的广告链接弹窗都会导致新页面不被收录。
如何加快网站收录?
1、 主动推送链接:更新站点地图,提交给搜索引擎,在百度资源验证网站安装自动推送代码,添加页面抓取。
2、 做好网站内容丰富度优化:关注长尾关键词排名布局,做更多用户会搜索的内容,文章和正文,内容不少于500字,图片3张左右,图片和 可以给用户思考,图片要加上ATL关键词,让搜索引擎知道图片的意思,内容要收录
关键词主题用户将搜索。
3、引导百度蜘蛛抓取:到百度蜘蛛活跃度高的网站和论坛,获取一些导航网站链接,换取几个优质好友链接,加速网站抓取和收录。
4、关注搜索反馈:如果长时间没有收录,可以向搜索引擎投诉反馈。如本文图1所示
5、开熊掌:熊掌对优质内容有原创保护,优质原创内容将在优质原创内容的采集
和展示方面给予优惠
6、链接传播与分享:从营销角度提升品牌搜索量。培养用户忠诚度,增加网站用户采集
,分享文章链接,频繁互动回访。这些操作将有助于提高搜索抓取的频率、推动页面更新并提高整体网站的包容性。
浏览器抓取网页(学习Python包并实现基本的爬虫过程Python中爬虫相关的包)
网站优化 • 优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-12-29 17:09
随着互联网数据的爆发式增长,我们可以通过使用Python爬虫获取大量有价值的数据:
1. 爬取数据,进行市场调研和商业分析
抓取知乎优质答案,筛选每个话题下的最佳内容;抓取房地产网站买卖信息,分析房价走势,做不同区域的房价分析;抓取招聘网站的职位信息,分析各行业层次的人才需求和薪酬。
2.作为机器学习和数据挖掘的原创
数据
比如你想做一个推荐系统,那么你可以爬取更多维度的数据,做一个更好的模型。
3. 爬取优质资源:图片、文字、视频
爬取商品评论和各种图片网站,获取图片资源和评论文字数据。
掌握正确的方法,能够在短时间内抓取主流网站的数据,其实很容易。
首先我们来了解一下爬虫的基本原理和流程
大多数爬虫都遵循“发送请求-获取页面-解析页面-提取并存储内容”的过程,实际上模拟了使用浏览器获取网页信息的过程。
简单的说,我们向服务器发送请求后,会得到返回的页面。解析完页面后,我们就可以提取出我们想要的那部分信息,存放在指定的文档或数据库中。
在这部分,您可以对HTTP协议和网页的基础知识,如POSTGET、HTML、CSS、JS等有一个简单的了解,简单的了解一下,无需系统学习。
学习Python包,实现基本爬取过程
Python中有很多爬虫相关的包:urllib、requests、bs4、scrapy、pyspider等,建议从requests+Xpath入手。Requests 负责连接到网站并返回到网页。Xpath用于解析网页,方便数据提取。
如果你用过BeautifulSoup,你会发现Xpath省了很多麻烦,层层检查元素代码的工作全部省略了。掌握了之后,你会发现爬虫的基本套路都差不多。一般的静态网站都不是问题。小猪,豆瓣,尴尬百科,腾讯新闻等基本都可以用。
保存数据
首先,我们说到存储数据,是因为在最初的学习中,接触很少,没有必要过多关注。随着学习的逐渐深入,当我们需要保存大量数据的时候,就需要学习数据库了。相关知识!
初期,我们抓到需要的内容后,只需要保存到本地即可。无非是文件、表格(excel)等几种方法。这里只需要掌握with语句就可以基本保证需求。它看起来像这样:
with open (path and file name, save mode) as f:
f.write(数据)#如果是文本,可以直接写入,如果是其他文件,数据最好用二进制方式
当然需要使用xlwt库(excel)和python-docx库(word)保存到excel表格或者word文档中。这个网上很多,可以自己学。
获取数据
说了这么多,我们来谈谈正题。如何抓取我们想要的数据?我们一步一步来!
一般所谓的抓取网页内容是指通过Python脚本访问某个URL地址(请求数据),然后获取返回的内容(HTML源代码、Json格式字符串等)。然后通过解析规则(页面解析),对我们需要的数据进行分析和获取(内容匹配)。
在python中实现爬虫非常方便。有大量的库可以满足我们的需求。比如首先使用requests库获取一个url(网页)的源码
导入请求#导入库
url ='您的目标网址'
response = requests.get(url) #请求数据
print(response.text) #打印出数据的文本内容
这几行代码就可以拿到网页的源码了,但是有时候会出现乱码,为什么呢?
由于中文网站收录
中文,终端不支持gbk编码,打印时需要将中文从gbk格式转换为终端支持的编码,一般为utf-8编码。
所以在我们打印响应之前,我们需要指定它的编码(我们可以直接将代码显示的编码格式指定为网页本身的编码格式,比如utf-8。网页的编码格式一般是源代码中标签下的字符集。在属性中指定)。只需添加一行。
response.encode ='utf-8' #指定编码格式
至此,我们已经获得了网页的源代码。下一步是在杂乱的源代码中找到我们需要的东西。这里需要用到各种匹配方法。常用的方法有:正则表达式(re库)、bs4(Beautifulsoup4库)、xpath(lxml库)!
建议大家从常规规则开始学习,最后一定要看看xpath,爬虫框架scrapy中用的很多!
通过各种匹配方式找到我们的内容后(注意:一般匹配是一个列表),我们就到了上面提到的存储数据的阶段,这样就完成了一个简单的爬虫!
当然,我们在写代码的时候,会发现很多上面没有提到的内容,比如
剩下的我们慢慢研究。
总结
Python爬虫技术不需要你系统地精通一门语言,也不需要任何高级的数据库技术。高效的姿势就是从实际项目中学习这些零散的知识点,可以保证每次学习到的都是最需要的部分。
当然,唯一的麻烦是在具体问题中,如何找到具体需要的那部分学习资源,如何筛选筛选,是很多初学者面临的一大难题。
分享IT技术和行业经验,请关注-技校。 查看全部
浏览器抓取网页(学习Python包并实现基本的爬虫过程Python中爬虫相关的包)
随着互联网数据的爆发式增长,我们可以通过使用Python爬虫获取大量有价值的数据:
1. 爬取数据,进行市场调研和商业分析
抓取知乎优质答案,筛选每个话题下的最佳内容;抓取房地产网站买卖信息,分析房价走势,做不同区域的房价分析;抓取招聘网站的职位信息,分析各行业层次的人才需求和薪酬。
2.作为机器学习和数据挖掘的原创
数据
比如你想做一个推荐系统,那么你可以爬取更多维度的数据,做一个更好的模型。
3. 爬取优质资源:图片、文字、视频
爬取商品评论和各种图片网站,获取图片资源和评论文字数据。
掌握正确的方法,能够在短时间内抓取主流网站的数据,其实很容易。
首先我们来了解一下爬虫的基本原理和流程
大多数爬虫都遵循“发送请求-获取页面-解析页面-提取并存储内容”的过程,实际上模拟了使用浏览器获取网页信息的过程。
简单的说,我们向服务器发送请求后,会得到返回的页面。解析完页面后,我们就可以提取出我们想要的那部分信息,存放在指定的文档或数据库中。
在这部分,您可以对HTTP协议和网页的基础知识,如POSTGET、HTML、CSS、JS等有一个简单的了解,简单的了解一下,无需系统学习。
学习Python包,实现基本爬取过程
Python中有很多爬虫相关的包:urllib、requests、bs4、scrapy、pyspider等,建议从requests+Xpath入手。Requests 负责连接到网站并返回到网页。Xpath用于解析网页,方便数据提取。
如果你用过BeautifulSoup,你会发现Xpath省了很多麻烦,层层检查元素代码的工作全部省略了。掌握了之后,你会发现爬虫的基本套路都差不多。一般的静态网站都不是问题。小猪,豆瓣,尴尬百科,腾讯新闻等基本都可以用。
保存数据
首先,我们说到存储数据,是因为在最初的学习中,接触很少,没有必要过多关注。随着学习的逐渐深入,当我们需要保存大量数据的时候,就需要学习数据库了。相关知识!
初期,我们抓到需要的内容后,只需要保存到本地即可。无非是文件、表格(excel)等几种方法。这里只需要掌握with语句就可以基本保证需求。它看起来像这样:
with open (path and file name, save mode) as f:
f.write(数据)#如果是文本,可以直接写入,如果是其他文件,数据最好用二进制方式
当然需要使用xlwt库(excel)和python-docx库(word)保存到excel表格或者word文档中。这个网上很多,可以自己学。
获取数据
说了这么多,我们来谈谈正题。如何抓取我们想要的数据?我们一步一步来!
一般所谓的抓取网页内容是指通过Python脚本访问某个URL地址(请求数据),然后获取返回的内容(HTML源代码、Json格式字符串等)。然后通过解析规则(页面解析),对我们需要的数据进行分析和获取(内容匹配)。
在python中实现爬虫非常方便。有大量的库可以满足我们的需求。比如首先使用requests库获取一个url(网页)的源码
导入请求#导入库
url ='您的目标网址'
response = requests.get(url) #请求数据
print(response.text) #打印出数据的文本内容
这几行代码就可以拿到网页的源码了,但是有时候会出现乱码,为什么呢?
由于中文网站收录
中文,终端不支持gbk编码,打印时需要将中文从gbk格式转换为终端支持的编码,一般为utf-8编码。
所以在我们打印响应之前,我们需要指定它的编码(我们可以直接将代码显示的编码格式指定为网页本身的编码格式,比如utf-8。网页的编码格式一般是源代码中标签下的字符集。在属性中指定)。只需添加一行。
response.encode ='utf-8' #指定编码格式
至此,我们已经获得了网页的源代码。下一步是在杂乱的源代码中找到我们需要的东西。这里需要用到各种匹配方法。常用的方法有:正则表达式(re库)、bs4(Beautifulsoup4库)、xpath(lxml库)!
建议大家从常规规则开始学习,最后一定要看看xpath,爬虫框架scrapy中用的很多!
通过各种匹配方式找到我们的内容后(注意:一般匹配是一个列表),我们就到了上面提到的存储数据的阶段,这样就完成了一个简单的爬虫!
当然,我们在写代码的时候,会发现很多上面没有提到的内容,比如
剩下的我们慢慢研究。
总结
Python爬虫技术不需要你系统地精通一门语言,也不需要任何高级的数据库技术。高效的姿势就是从实际项目中学习这些零散的知识点,可以保证每次学习到的都是最需要的部分。
当然,唯一的麻烦是在具体问题中,如何找到具体需要的那部分学习资源,如何筛选筛选,是很多初学者面临的一大难题。
分享IT技术和行业经验,请关注-技校。
浏览器抓取网页(知道了要访问的URL地址是什么)
网站优化 • 优采云 发表了文章 • 0 个评论 • 44 次浏览 • 2022-01-20 02:14
1.我知道要访问的URL地址是什么
请求网址
2.【可选】如果是GET方法,是否还有其他参数
这个参数:
3.判断是GET还是POST方法
4.添加对应的标头(Header)信息
即请求头
5.【可选】如果是POST方式,还需要填写对应的数据
这个数据:
换句话说:
如果是 GET,则没有 POST 数据。
提示:所以,在你在 IE9 中通过 F12 抓取的内容中,你会看到对于所有的 GET 请求,对应的“请求体”都是空的。
6.其他一些你可能需要准备的东西
(1)代理代理
(2)设置最大超时超时时间
(3)有没有cookie
提交HttpRequest,就可以得到这个http请求的response Response(访问URL后要做的工作)
1.得到对应的响应
2.从响应中获取对应的网页源码等信息
(1)获取返回网页的HTML源代码(或json等)
(2)[可选] 必要时也获取对应的cookie
(3)[可选]判断返回的一些其他相关信息,如响应码等。
【网页抓取时的注意事项】
1.网页跳转重定向
(1)直接跳转
(2)间接跳转
A.javascript脚本中有对应的代码实现网页跳转
B、自身返回的HTML源码中收录刷新动作,实现网页跳转
爬网后,如何分析得到想要的内容
一般来说,当你访问一个 URL 地址时,返回的内容大部分是网页的 HTML 源代码,还有其他形式的内容,比如 json 等。
我们要的是从返回的内容(HTML或者json等)中提取出我们需要的具体信息,也就是对其进行处理,得到需要的信息。
据我所知,有几种方法可以实现提取所需信息:
1. 对于 HTML 源代码:
(1)如果是Python的话,可以通过调用第三方Beautifulsoup库调用
然后调用find等函数提取相应的信息。
这部分内容比较复杂,需要进一步了解,可以参考:
BlogsToWordPress v3.0 – 将百度空间、网易163等博客移至WordPress
中的源代码。
(2)直接使用正则表达式自行提取相关内容
对于内容分析和提取,在很多情况下都会用到正则表达式。
正则表达式的知识和总结,请看这里:
[总结] 关于正则表达式 v2012-02-20
正则表达式是一种规范/规则,您可以使用哪种语言来实现它。
我遇到过两种语言,Python 和 C#:
A. Python:使用re模块,常用函数有find、findall、search等。
B:C#:使用Regex类来匹配对应的模式和匹配函数。
有关 C# 中的正则表达式的更多信息,请参阅:
【总结】C#中Regex的经验及注意事项
2.对于 Json
可以先看一下JSON的介绍:
【组织】什么是JSON+如何处理JSON字符串
然后看看下面如何处理Json。
(1)使用库(函数)来处理
A. 蟒蛇
Python中有对应的json库。常用的是json.load,可以将json格式的字符串转换成对应的字典类型变量,非常好用。
(2) 还是用正则表达式处理
A. 蟒蛇
Python 中的 re 模块,同上。
B. C#
C#好像没有json库,但是第三方json库有很多,但是遇到解析json字符串的时候,感觉这些库用起来还是很麻烦,所以还是用regex类来处理它。.
模拟登录的一般逻辑和流程网站
至于使用C#实现网页内容爬取和模拟登陆网页,一些经验和注意事项,看这里: 查看全部
浏览器抓取网页(知道了要访问的URL地址是什么)
1.我知道要访问的URL地址是什么
请求网址
2.【可选】如果是GET方法,是否还有其他参数
这个参数:
3.判断是GET还是POST方法
4.添加对应的标头(Header)信息
即请求头
5.【可选】如果是POST方式,还需要填写对应的数据
这个数据:
换句话说:
如果是 GET,则没有 POST 数据。
提示:所以,在你在 IE9 中通过 F12 抓取的内容中,你会看到对于所有的 GET 请求,对应的“请求体”都是空的。
6.其他一些你可能需要准备的东西
(1)代理代理
(2)设置最大超时超时时间
(3)有没有cookie
提交HttpRequest,就可以得到这个http请求的response Response(访问URL后要做的工作)
1.得到对应的响应
2.从响应中获取对应的网页源码等信息
(1)获取返回网页的HTML源代码(或json等)
(2)[可选] 必要时也获取对应的cookie
(3)[可选]判断返回的一些其他相关信息,如响应码等。
【网页抓取时的注意事项】
1.网页跳转重定向
(1)直接跳转
(2)间接跳转
A.javascript脚本中有对应的代码实现网页跳转
B、自身返回的HTML源码中收录刷新动作,实现网页跳转
爬网后,如何分析得到想要的内容
一般来说,当你访问一个 URL 地址时,返回的内容大部分是网页的 HTML 源代码,还有其他形式的内容,比如 json 等。
我们要的是从返回的内容(HTML或者json等)中提取出我们需要的具体信息,也就是对其进行处理,得到需要的信息。
据我所知,有几种方法可以实现提取所需信息:
1. 对于 HTML 源代码:
(1)如果是Python的话,可以通过调用第三方Beautifulsoup库调用
然后调用find等函数提取相应的信息。
这部分内容比较复杂,需要进一步了解,可以参考:
BlogsToWordPress v3.0 – 将百度空间、网易163等博客移至WordPress
中的源代码。
(2)直接使用正则表达式自行提取相关内容
对于内容分析和提取,在很多情况下都会用到正则表达式。
正则表达式的知识和总结,请看这里:
[总结] 关于正则表达式 v2012-02-20
正则表达式是一种规范/规则,您可以使用哪种语言来实现它。
我遇到过两种语言,Python 和 C#:
A. Python:使用re模块,常用函数有find、findall、search等。
B:C#:使用Regex类来匹配对应的模式和匹配函数。
有关 C# 中的正则表达式的更多信息,请参阅:
【总结】C#中Regex的经验及注意事项
2.对于 Json
可以先看一下JSON的介绍:
【组织】什么是JSON+如何处理JSON字符串
然后看看下面如何处理Json。
(1)使用库(函数)来处理
A. 蟒蛇
Python中有对应的json库。常用的是json.load,可以将json格式的字符串转换成对应的字典类型变量,非常好用。
(2) 还是用正则表达式处理
A. 蟒蛇
Python 中的 re 模块,同上。
B. C#
C#好像没有json库,但是第三方json库有很多,但是遇到解析json字符串的时候,感觉这些库用起来还是很麻烦,所以还是用regex类来处理它。.
模拟登录的一般逻辑和流程网站
至于使用C#实现网页内容爬取和模拟登陆网页,一些经验和注意事项,看这里:
浏览器抓取网页(基于Windows注册表实现浏览器安装位置的查找功能和使用指定浏览器打开网页的功能)
网站优化 • 优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2022-01-19 12:03
说明
本程序基于Windows注册表实现搜索浏览器安装位置的功能和使用指定浏览器打开网页的功能。
使用get_browser_path函数获取对应名称浏览器的安装位置,使用open_url函数直接使用指定浏览器打开对应页面,
可以同时指定多个浏览器,优先级从前到后。目前支持'IE'、'chrome'、'edge'、'firefox'、'360'等浏览器。如果还有其他浏览器需要支持,只需在_browser_regs中添加相应的注册表信息即可。
代码
"""
使用 get_browser_path 函数可获取对应名称的浏览器的安装位置,使用 open_url 函数可直接使用指定的浏览器打开对应页面,
可同时指定多个浏览器,优先级从前到后。当前支持 'IE','chrome','edge','firefox','360' 等浏览器,如果有其他浏览器需要支持,只需在 _browser_regs 中补充对应注册表信息即可
"""
import webbrowser
import winreg
# 浏览器注册表信息
_browser_regs = {
'IE': r"SOFTWARE\Clients\StartMenuInternet\IEXPLORE.EXE\DefaultIcon",
'chrome': r"SOFTWARE\Clients\StartMenuInternet\Google Chrome\DefaultIcon",
'edge': r"SOFTWARE\Clients\StartMenuInternet\Microsoft Edge\DefaultIcon",
'firefox': r"SOFTWARE\Clients\StartMenuInternet\FIREFOX.EXE\DefaultIcon",
'360': r"SOFTWARE\Clients\StartMenuInternet\360Chrome\DefaultIcon",
}
def get_browser_path(browser):
"""
获取浏览器的安装路径
:param browser: 浏览器名称
"""
try:
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, _browser_regs[browser])
except FileNotFoundError:
return None
value, _type = winreg.QueryValueEx(key, "")
return value.split(',')[0]
def open_url(url, browsers=('IE',)):
"""
使用指定的浏览器打开url对应的网页地址
:param url: 网页地址
:param browsers: 浏览器名称列表
:return: 是否打开成功
"""
for browser in browsers:
path = get_browser_path(browser)
if path:
print(f'open with browser: `{browser}`, path: `{path}`')
webbrowser.register(browser, None, webbrowser.BackgroundBrowser(path))
webbrowser.get(browser).open(url)
return True
return False
if __name__ == '__main__':
print("IE:", get_browser_path('IE'))
print("谷歌:", get_browser_path('chrome'))
print("edge: ", get_browser_path('edge'))
print("火狐:", get_browser_path('firefox'))
print("360: ", get_browser_path('360'))
if open_url('www.baidu.com', browsers=('chrome', 'firefox')):
print('打开成功')
else:
print('打开失败,请安装 Chrome 或 Firefox 浏览器后重试')
运行结果 查看全部
浏览器抓取网页(基于Windows注册表实现浏览器安装位置的查找功能和使用指定浏览器打开网页的功能)
说明
本程序基于Windows注册表实现搜索浏览器安装位置的功能和使用指定浏览器打开网页的功能。
使用get_browser_path函数获取对应名称浏览器的安装位置,使用open_url函数直接使用指定浏览器打开对应页面,
可以同时指定多个浏览器,优先级从前到后。目前支持'IE'、'chrome'、'edge'、'firefox'、'360'等浏览器。如果还有其他浏览器需要支持,只需在_browser_regs中添加相应的注册表信息即可。
代码
"""
使用 get_browser_path 函数可获取对应名称的浏览器的安装位置,使用 open_url 函数可直接使用指定的浏览器打开对应页面,
可同时指定多个浏览器,优先级从前到后。当前支持 'IE','chrome','edge','firefox','360' 等浏览器,如果有其他浏览器需要支持,只需在 _browser_regs 中补充对应注册表信息即可
"""
import webbrowser
import winreg
# 浏览器注册表信息
_browser_regs = {
'IE': r"SOFTWARE\Clients\StartMenuInternet\IEXPLORE.EXE\DefaultIcon",
'chrome': r"SOFTWARE\Clients\StartMenuInternet\Google Chrome\DefaultIcon",
'edge': r"SOFTWARE\Clients\StartMenuInternet\Microsoft Edge\DefaultIcon",
'firefox': r"SOFTWARE\Clients\StartMenuInternet\FIREFOX.EXE\DefaultIcon",
'360': r"SOFTWARE\Clients\StartMenuInternet\360Chrome\DefaultIcon",
}
def get_browser_path(browser):
"""
获取浏览器的安装路径
:param browser: 浏览器名称
"""
try:
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, _browser_regs[browser])
except FileNotFoundError:
return None
value, _type = winreg.QueryValueEx(key, "")
return value.split(',')[0]
def open_url(url, browsers=('IE',)):
"""
使用指定的浏览器打开url对应的网页地址
:param url: 网页地址
:param browsers: 浏览器名称列表
:return: 是否打开成功
"""
for browser in browsers:
path = get_browser_path(browser)
if path:
print(f'open with browser: `{browser}`, path: `{path}`')
webbrowser.register(browser, None, webbrowser.BackgroundBrowser(path))
webbrowser.get(browser).open(url)
return True
return False
if __name__ == '__main__':
print("IE:", get_browser_path('IE'))
print("谷歌:", get_browser_path('chrome'))
print("edge: ", get_browser_path('edge'))
print("火狐:", get_browser_path('firefox'))
print("360: ", get_browser_path('360'))
if open_url('www.baidu.com', browsers=('chrome', 'firefox')):
print('打开成功')
else:
print('打开失败,请安装 Chrome 或 Firefox 浏览器后重试')
运行结果
浏览器抓取网页(新建隐身窗口的学习目标和学习方法(一))
网站优化 • 优采云 发表了文章 • 0 个评论 • 65 次浏览 • 2022-01-17 15:16
学习目标
1、了解创建新隐身窗口的目的;
2、了解chrome中network的使用;
3、了解如何找到登录界面;
1 创建一个新的隐身窗口
在浏览器中直接打开网站会自动带上之前网站中保存的cookie,但是爬虫第一次获取页面时并没有携带cookie。如何解决这种情况?
使用隐身窗口,第一次打开网站,不带cookie,可以观察页面获取情况,包括对方服务器如何在本地设置cookie。
2、chrome中网络的更多功能
2.1 保存日志
默认情况下,页面跳转后,之前的请求url地址等信息会消失,查看perserve日志后会保留之前的请求。
2.2 过滤器过滤
当url地址较多时,可以在过滤器中输入一些url地址,对所有url地址都有一定的过滤作用。具体位置在上面第二张图中2的位置。
2.3 监视特定类型的请求
在上面第二张图中3的位置,有很多选择。沉默者全选,即各种请求都会被观察。在很多情况下,可以根据自己的目的选择所有右边的其他选项,例如常见的选项:
XHR:在大多数情况下,它代表一个ajax请求;
JS:js请求;
CSS:css请求;
但是很多时候我们并不能保证我们需要什么类型的请求,尤其是当我们不知道一个请求是不是ajax请求的时候,我们可以直接全选,前后观察。能。
不要被浏览器中的一堆请求吓到。除了js、css、图片请求,其他的请求并不多。
3 找到登录界面
回顾人人网之前的爬虫,我们发现了一个登录界面,那么这个界面是从哪里来的呢?
可以发现,这个地址就是表单中action对应的url地址。回顾前端知识点,可以发现是提交表单的地址,对应的提交数据只需要:在用户名的输入标签中,使用name的值作为key,用户名作为value,在password的input标签中,name的value作为key,password作为value。
思考:
没有对应action的url地址怎么办?
3.2 通过抓包找到登录的url地址
通过抓包可以发现这个url地址和请求权重中有参数,比如uniqueTimestamp和rkey以及加密密码
这时候我们可以观察手机版的登录界面是否一样。 查看全部
浏览器抓取网页(新建隐身窗口的学习目标和学习方法(一))
学习目标
1、了解创建新隐身窗口的目的;
2、了解chrome中network的使用;
3、了解如何找到登录界面;
1 创建一个新的隐身窗口
在浏览器中直接打开网站会自动带上之前网站中保存的cookie,但是爬虫第一次获取页面时并没有携带cookie。如何解决这种情况?
使用隐身窗口,第一次打开网站,不带cookie,可以观察页面获取情况,包括对方服务器如何在本地设置cookie。
2、chrome中网络的更多功能

2.1 保存日志
默认情况下,页面跳转后,之前的请求url地址等信息会消失,查看perserve日志后会保留之前的请求。
2.2 过滤器过滤
当url地址较多时,可以在过滤器中输入一些url地址,对所有url地址都有一定的过滤作用。具体位置在上面第二张图中2的位置。
2.3 监视特定类型的请求
在上面第二张图中3的位置,有很多选择。沉默者全选,即各种请求都会被观察。在很多情况下,可以根据自己的目的选择所有右边的其他选项,例如常见的选项:
XHR:在大多数情况下,它代表一个ajax请求;
JS:js请求;
CSS:css请求;
但是很多时候我们并不能保证我们需要什么类型的请求,尤其是当我们不知道一个请求是不是ajax请求的时候,我们可以直接全选,前后观察。能。
不要被浏览器中的一堆请求吓到。除了js、css、图片请求,其他的请求并不多。
3 找到登录界面
回顾人人网之前的爬虫,我们发现了一个登录界面,那么这个界面是从哪里来的呢?

可以发现,这个地址就是表单中action对应的url地址。回顾前端知识点,可以发现是提交表单的地址,对应的提交数据只需要:在用户名的输入标签中,使用name的值作为key,用户名作为value,在password的input标签中,name的value作为key,password作为value。
思考:
没有对应action的url地址怎么办?
3.2 通过抓包找到登录的url地址

通过抓包可以发现这个url地址和请求权重中有参数,比如uniqueTimestamp和rkey以及加密密码
这时候我们可以观察手机版的登录界面是否一样。
浏览器抓取网页(从IE浏览器获取当前页面内容可能有多种方式的资料)
网站优化 • 优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2022-01-16 20:18
从IE浏览器获取当前页面内容的方法可能有很多种,今天就介绍其中的一种。基本原理:鼠标点击当前IE页面时,获取鼠标的坐标位置,根据鼠标位置获取当前页面的句柄,然后根据句柄调用win32的东西获取页面内容。感兴趣的朋友可以参考以下文章
private void timer1_Tick(object sender, EventArgs e)
{
lock (currentLock)
{
System.Drawing.Point MousePoint = System.Windows.Forms.Form.MousePosition;
if (_leftClick)
{
timer1.Stop();
_leftClick = false;
_lastDocument = GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false));
if (_lastDocument != null)
{
if (_getDocument)
{
_getDocument = true;
try
{
string url = _lastDocument.url;
string html = _lastDocument.documentElement.outerHTML;
string cookie = _lastDocument.cookie;
string domain = _lastDocument.domain;
var resolveParams = new ResolveParam
{
Url = new Uri(url),
Html = html,
PageCookie = cookie,
Domain = domain
};
RequetResove(resolveParams);
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
}
}
else
{
new MessageTip().Show("xx", "当前页面不是IE浏览器页面,或使用了非IE内核浏览器,如火狐,搜狗等。请使用IE浏览器打开网页");
}
_getDocument = false;
}
else
{
_pointFrm.Left = MousePoint.X + 10;
_pointFrm.Top = MousePoint.Y + 10;
}
}
}
在第11行GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false))的分解下,首先从鼠标坐标获取页面句柄:
public static IntPtr GetPointControl(System.Drawing.Point p, bool allControl)
{
IntPtr handle = Win32APIsFull.WindowFromPoint(p);
if (handle != IntPtr.Zero)
{
System.Drawing.Rectangle rect = default(System.Drawing.Rectangle);
if (Win32APIsFull.GetWindowRect(handle, out rect))
{
return Win32APIsFull.ChildWindowFromPointEx(handle, new System.Drawing.Point(p.X - rect.X, p.Y - rect.Y), allControl ? Win32APIsFull.CWP.ALL : Win32APIsFull.CWP.SKIPINVISIBLE);
}
}
return IntPtr.Zero;
}
接下来根据句柄获取页面内容:
public static HTMLDocument GetHTMLDocumentFormHwnd(IntPtr hwnd)
{
IntPtr result = Marshal.AllocHGlobal(4);
Object obj = null;
Console.WriteLine(Win32APIsFull.SendMessageTimeoutA(hwnd, HTML_GETOBJECT_mid, 0, 0, 2, 1000, result));
if (Marshal.ReadInt32(result) != 0)
{
Console.WriteLine(Win32APIsFull.ObjectFromLresult(Marshal.ReadInt32(result), ref IID_IHTMLDocument, 0, out obj));
}
Marshal.FreeHGlobal(result);
return obj as HTMLDocument;
}
一般原则:
向IE窗体发送消息,获取指向IE浏览器内存块的指针(非托管),然后根据该指针获取HTMLDocument对象。
该方法涉及win32的两个功能:
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "SendMessageTimeoutA")]
public static extern int SendMessageTimeoutA(
[InAttribute()] System.IntPtr hWnd,
uint Msg, uint wParam, int lParam,
uint fuFlags,
uint uTimeout,
System.IntPtr lpdwResult);
[System.Runtime.InteropServices.DllImportAttribute("oleacc.dll", EntryPoint = "ObjectFromLresult")]
public static extern int ObjectFromLresult(
int lResult,
ref Guid riid,
int wParam,
[MarshalAs(UnmanagedType.IDispatch), Out]
out Object pObject
);
以上是c#从IE浏览器获取当前页面内容的详细内容。更多c#获取浏览器页面内容请关注Scripting Home文章的其他相关话题! 查看全部
浏览器抓取网页(从IE浏览器获取当前页面内容可能有多种方式的资料)
从IE浏览器获取当前页面内容的方法可能有很多种,今天就介绍其中的一种。基本原理:鼠标点击当前IE页面时,获取鼠标的坐标位置,根据鼠标位置获取当前页面的句柄,然后根据句柄调用win32的东西获取页面内容。感兴趣的朋友可以参考以下文章
private void timer1_Tick(object sender, EventArgs e)
{
lock (currentLock)
{
System.Drawing.Point MousePoint = System.Windows.Forms.Form.MousePosition;
if (_leftClick)
{
timer1.Stop();
_leftClick = false;
_lastDocument = GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false));
if (_lastDocument != null)
{
if (_getDocument)
{
_getDocument = true;
try
{
string url = _lastDocument.url;
string html = _lastDocument.documentElement.outerHTML;
string cookie = _lastDocument.cookie;
string domain = _lastDocument.domain;
var resolveParams = new ResolveParam
{
Url = new Uri(url),
Html = html,
PageCookie = cookie,
Domain = domain
};
RequetResove(resolveParams);
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
}
}
else
{
new MessageTip().Show("xx", "当前页面不是IE浏览器页面,或使用了非IE内核浏览器,如火狐,搜狗等。请使用IE浏览器打开网页");
}
_getDocument = false;
}
else
{
_pointFrm.Left = MousePoint.X + 10;
_pointFrm.Top = MousePoint.Y + 10;
}
}
}
在第11行GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false))的分解下,首先从鼠标坐标获取页面句柄:
public static IntPtr GetPointControl(System.Drawing.Point p, bool allControl)
{
IntPtr handle = Win32APIsFull.WindowFromPoint(p);
if (handle != IntPtr.Zero)
{
System.Drawing.Rectangle rect = default(System.Drawing.Rectangle);
if (Win32APIsFull.GetWindowRect(handle, out rect))
{
return Win32APIsFull.ChildWindowFromPointEx(handle, new System.Drawing.Point(p.X - rect.X, p.Y - rect.Y), allControl ? Win32APIsFull.CWP.ALL : Win32APIsFull.CWP.SKIPINVISIBLE);
}
}
return IntPtr.Zero;
}
接下来根据句柄获取页面内容:
public static HTMLDocument GetHTMLDocumentFormHwnd(IntPtr hwnd)
{
IntPtr result = Marshal.AllocHGlobal(4);
Object obj = null;
Console.WriteLine(Win32APIsFull.SendMessageTimeoutA(hwnd, HTML_GETOBJECT_mid, 0, 0, 2, 1000, result));
if (Marshal.ReadInt32(result) != 0)
{
Console.WriteLine(Win32APIsFull.ObjectFromLresult(Marshal.ReadInt32(result), ref IID_IHTMLDocument, 0, out obj));
}
Marshal.FreeHGlobal(result);
return obj as HTMLDocument;
}
一般原则:
向IE窗体发送消息,获取指向IE浏览器内存块的指针(非托管),然后根据该指针获取HTMLDocument对象。
该方法涉及win32的两个功能:
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "SendMessageTimeoutA")]
public static extern int SendMessageTimeoutA(
[InAttribute()] System.IntPtr hWnd,
uint Msg, uint wParam, int lParam,
uint fuFlags,
uint uTimeout,
System.IntPtr lpdwResult);
[System.Runtime.InteropServices.DllImportAttribute("oleacc.dll", EntryPoint = "ObjectFromLresult")]
public static extern int ObjectFromLresult(
int lResult,
ref Guid riid,
int wParam,
[MarshalAs(UnmanagedType.IDispatch), Out]
out Object pObject
);
以上是c#从IE浏览器获取当前页面内容的详细内容。更多c#获取浏览器页面内容请关注Scripting Home文章的其他相关话题!
浏览器抓取网页( Python中一个非常成熟的库——selenium专栏(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 137 次浏览 • 2022-01-13 12:15
Python中一个非常成熟的库——selenium专栏(组图))
本系列文章收录在公众号:数据宇宙>py爬虫>Selenium
转发本文并私信我“python”,可以获得Python资料及更多系列文章(持续更新)
作为“数据玩家”,手头没有数据怎么办?当然,用代码自动化采集数据,但现在“爬虫”可没那么容易了,其中最难的是突破网站的各种反爬机制。本系列将全面讲解Python中一个非常成熟的库——selenium,并教你如何使用它在网络上爬取你需要的数据
虽然自动爬虫很方便,但希望大家可以考虑到网站服务器的承受能力,不要频繁访问网站。永远不要采集敏感数据!!否则很容易“从入门到监狱”
本系列大部分案例都是selenium和pyppeteer库同时讲解的,并且有Python和C#2语言的实现文章,详情请到公众号目录。
当你得到数据时,你还需要对数据进行处理和分析。我的 pandas 专栏是高级教程的最佳介绍。
前言
学习任何库,首先要了解库的机制和流程。今天,我们将从一个小例子开始我们的学习之旅。
搜索和采集结果的标题
要求如下:
硒的问题
这个系列一直围绕着一个点:“用代码操作浏览器”,我们来看看整个过程:
然而,市面上的浏览器种类繁多,甚至一个厂商的浏览器版本也不同。我们如何保证我们的代码只需要编写一次就可以控制不同的浏览器?
更深入的流程图如下:
“案子怎么还没开始,就说硒不是?我还在学吗?”
他有以下优点:
缺点:
如果觉得不能接受selenium的缺点,可以查看pyppeteer的相关文章(公众号:大数据宇宙>py爬虫>pyppeteer)
得到驱动
现在让我们开始使用 selenium 来解决我们的需求。
首先,使用 pip 安装 selenium
由于我在本地安装了谷歌Chrome浏览器,打开浏览器查看浏览器的版本:
然后去相关的网站(私信我“python”)下载对应的驱动:
一切都准备好了
看过我相关教学文章的人都知道,我喜欢从语义的角度去理解和学习图书馆。
Selenium 本质上控制着浏览器,所以我们在使用它的时候,代码的语义应该类似于手动操作浏览器的过程。
首先导入一些包:
让我们看看如何使用代码来描述我们的手动操作。
打开浏览器:
没错,我们只是下载了驱动程序,但是 Python 怎么知道在哪里可以找到该驱动程序呢?
我们可以在实例化浏览器对象的时候传入一个文件路径,告诉他程序的具体位置:
输入百度搜索的网址:
将鼠标移动到输入框,点击一次,然后输入内容“爬虫”:
这里的问题是,如何在代码中表达“鼠标到输入框,点击一次”?
其实selenium确实可以模拟鼠标移动等操作(网站的一些登录验证码需要用鼠标拉动拼图来模拟),但是目前的情况下,我们不应该模拟鼠标,而是根据html标签定位。.
此时,我们可以使用浏览器的“开发者功能”进行定位。
限于篇幅,本文不详细讲解“开发者功能”的所有操作,详细讲解会放在公众号目录:数据宇宙>爬虫工具>系列文章
下面用一张动态图来展示操作过程:
看一下代码:
接下来,输入内容“爬虫”:
我们继续模拟点击输入框右侧的“百度点击”按钮。
同样使用“开发人员功能”,找到元素并复制 css 选择器表达式字符串:
所有结果的主标题:
这对初学者来说可能有点困难,因为这一次我们需要同时选择多个元素(多个搜索结果的主标题),并查看定位到的标签:
仔细看看我们需要的主要标题在哪里:
所以,现在我们将使用 CSS 选择器来表达以下语义: 在 div 内部 (id=content_left),在 h3 标记内部的 a 标记文本。div 和 h3 之间可能有多层嵌套。
生成的选择器表达式如下:
调用代码如下:
Python基础教程教材 Python编程从零基础到实际项目实例
¥59
买
代码执行太快
上面的代码之所以没有得到任何结果,是因为执行第10行的代码时,页面上还没有加载任何结果。
如果一个人正在操作浏览器,那么你应该对他说:嘿,直到你看到那些结果,你去提取主标题。
怎么说“直到你看到那些结果”?,selenium有一种特殊的等待元素出现的机制,代码如下:
用控件关闭浏览器,完整代码如下:
总结
使用代码控制 selenium 与手动操作基本相同。一般流程是:
下一节,我们将介绍更多的selenium技能,敬请期待!!
私信我“python”获取本系列所有相关资料和源码文章 查看全部
浏览器抓取网页(
Python中一个非常成熟的库——selenium专栏(组图))
本系列文章收录在公众号:数据宇宙>py爬虫>Selenium
转发本文并私信我“python”,可以获得Python资料及更多系列文章(持续更新)
作为“数据玩家”,手头没有数据怎么办?当然,用代码自动化采集数据,但现在“爬虫”可没那么容易了,其中最难的是突破网站的各种反爬机制。本系列将全面讲解Python中一个非常成熟的库——selenium,并教你如何使用它在网络上爬取你需要的数据
虽然自动爬虫很方便,但希望大家可以考虑到网站服务器的承受能力,不要频繁访问网站。永远不要采集敏感数据!!否则很容易“从入门到监狱”
本系列大部分案例都是selenium和pyppeteer库同时讲解的,并且有Python和C#2语言的实现文章,详情请到公众号目录。
当你得到数据时,你还需要对数据进行处理和分析。我的 pandas 专栏是高级教程的最佳介绍。
前言
学习任何库,首先要了解库的机制和流程。今天,我们将从一个小例子开始我们的学习之旅。
搜索和采集结果的标题
要求如下:
硒的问题
这个系列一直围绕着一个点:“用代码操作浏览器”,我们来看看整个过程:
然而,市面上的浏览器种类繁多,甚至一个厂商的浏览器版本也不同。我们如何保证我们的代码只需要编写一次就可以控制不同的浏览器?
更深入的流程图如下:
“案子怎么还没开始,就说硒不是?我还在学吗?”
他有以下优点:
缺点:
如果觉得不能接受selenium的缺点,可以查看pyppeteer的相关文章(公众号:大数据宇宙>py爬虫>pyppeteer)
得到驱动
现在让我们开始使用 selenium 来解决我们的需求。
首先,使用 pip 安装 selenium
由于我在本地安装了谷歌Chrome浏览器,打开浏览器查看浏览器的版本:
然后去相关的网站(私信我“python”)下载对应的驱动:
一切都准备好了
看过我相关教学文章的人都知道,我喜欢从语义的角度去理解和学习图书馆。
Selenium 本质上控制着浏览器,所以我们在使用它的时候,代码的语义应该类似于手动操作浏览器的过程。
首先导入一些包:
让我们看看如何使用代码来描述我们的手动操作。
打开浏览器:
没错,我们只是下载了驱动程序,但是 Python 怎么知道在哪里可以找到该驱动程序呢?
我们可以在实例化浏览器对象的时候传入一个文件路径,告诉他程序的具体位置:
输入百度搜索的网址:
将鼠标移动到输入框,点击一次,然后输入内容“爬虫”:
这里的问题是,如何在代码中表达“鼠标到输入框,点击一次”?
其实selenium确实可以模拟鼠标移动等操作(网站的一些登录验证码需要用鼠标拉动拼图来模拟),但是目前的情况下,我们不应该模拟鼠标,而是根据html标签定位。.
此时,我们可以使用浏览器的“开发者功能”进行定位。
限于篇幅,本文不详细讲解“开发者功能”的所有操作,详细讲解会放在公众号目录:数据宇宙>爬虫工具>系列文章
下面用一张动态图来展示操作过程:
看一下代码:
接下来,输入内容“爬虫”:
我们继续模拟点击输入框右侧的“百度点击”按钮。
同样使用“开发人员功能”,找到元素并复制 css 选择器表达式字符串:
所有结果的主标题:
这对初学者来说可能有点困难,因为这一次我们需要同时选择多个元素(多个搜索结果的主标题),并查看定位到的标签:
仔细看看我们需要的主要标题在哪里:
所以,现在我们将使用 CSS 选择器来表达以下语义: 在 div 内部 (id=content_left),在 h3 标记内部的 a 标记文本。div 和 h3 之间可能有多层嵌套。
生成的选择器表达式如下:
调用代码如下:
Python基础教程教材 Python编程从零基础到实际项目实例
¥59
买
代码执行太快
上面的代码之所以没有得到任何结果,是因为执行第10行的代码时,页面上还没有加载任何结果。
如果一个人正在操作浏览器,那么你应该对他说:嘿,直到你看到那些结果,你去提取主标题。
怎么说“直到你看到那些结果”?,selenium有一种特殊的等待元素出现的机制,代码如下:
用控件关闭浏览器,完整代码如下:
总结
使用代码控制 selenium 与手动操作基本相同。一般流程是:
下一节,我们将介绍更多的selenium技能,敬请期待!!
私信我“python”获取本系列所有相关资料和源码文章
浏览器抓取网页( UC浏览器关闭云加速功能方法设置-gt(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 252 次浏览 • 2022-01-13 12:11
UC浏览器关闭云加速功能方法设置-gt(组图))
近期有用户反馈:使用UC、Quark等国产浏览器访问部分网站博客会被屏蔽
出现类似“根据监管部门规定和投诉举报,此链接违反相关法律法规,禁止访问”的提示。
基于国产软件自带大量bucket和后门的一贯做法,不推荐使用各种“国产”浏览器。个人推荐:Chrome、Firefox。
如果一定要使用UC、Quark等国产浏览器,为了解决拦截问题,可以关闭这些浏览器所谓的“云加速”功能。
所谓云加速就是访问一个网站,不是直接访问网站地址,而是先请求UC和Quark的服务器,再请求UC,
Quark的服务器抓取目标网站的内容,对网页内容进行处理(如压缩、排版),返回给浏览器。
也是因为 UC 和 Quark 起到了类似代理服务器的作用。2G时代,UC浏览器就以这个功能而闻名。
在当前的5G时代,云加速功能不仅不提速,还经常拖慢网页的速度。
如何在 UC 浏览器中禁用云加速
设置 -> 快速/保存流媒体以关闭“云加速”和“快速模式”
如何在 Quark 浏览器中禁用云加速
设置 -> 常规 -> 云加速
关闭“云加速”
如何关闭QQ浏览器的云加速功能
设置->保存流加速->云加速关闭“云加速”
360浏览器如何关闭云加速
设置 -> 网页浏览设置 -> 云加速
关闭“云加速”
其他浏览器也有类似的设置项自己去发现。
除了浏览器的原因,网页被屏蔽,也可能是运营商等原因造成的。
在三大运营商中,中国移动经常莫名其妙地屏蔽合规网页。 查看全部
浏览器抓取网页(
UC浏览器关闭云加速功能方法设置-gt(组图))
近期有用户反馈:使用UC、Quark等国产浏览器访问部分网站博客会被屏蔽
出现类似“根据监管部门规定和投诉举报,此链接违反相关法律法规,禁止访问”的提示。
基于国产软件自带大量bucket和后门的一贯做法,不推荐使用各种“国产”浏览器。个人推荐:Chrome、Firefox。
如果一定要使用UC、Quark等国产浏览器,为了解决拦截问题,可以关闭这些浏览器所谓的“云加速”功能。
所谓云加速就是访问一个网站,不是直接访问网站地址,而是先请求UC和Quark的服务器,再请求UC,
Quark的服务器抓取目标网站的内容,对网页内容进行处理(如压缩、排版),返回给浏览器。
也是因为 UC 和 Quark 起到了类似代理服务器的作用。2G时代,UC浏览器就以这个功能而闻名。
在当前的5G时代,云加速功能不仅不提速,还经常拖慢网页的速度。
如何在 UC 浏览器中禁用云加速
设置 -> 快速/保存流媒体以关闭“云加速”和“快速模式”
如何在 Quark 浏览器中禁用云加速
设置 -> 常规 -> 云加速
关闭“云加速”
如何关闭QQ浏览器的云加速功能
设置->保存流加速->云加速关闭“云加速”
360浏览器如何关闭云加速
设置 -> 网页浏览设置 -> 云加速
关闭“云加速”
其他浏览器也有类似的设置项自己去发现。
除了浏览器的原因,网页被屏蔽,也可能是运营商等原因造成的。
在三大运营商中,中国移动经常莫名其妙地屏蔽合规网页。
浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
网站优化 • 优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2022-01-12 11:13
urllib.error.HTTPError:HTTP 错误 403:禁止
从403 Forbidden我们可以发现,此时网站禁止程序的访问,这是因为csdn网站已经设置了反爬虫机制,当网站检测到一个爬虫,访问会被拒绝,所以我们会得到上面的结果。
这时候我们需要模拟浏览器访问,为了避开网站的反爬虫机制,然后顺利抓取我们想要的内容。
接下来,我们将使用一个神奇的库 urllib.request.Request 进行我们的模拟工作。这次我们先代码再讲解,不过这次要提醒一下,下面的代码不能直接使用。其中my_headers中的User-Agent替换为我自己的。因为我加了省略号保密,所以不能直接使用。替换方法如下图所示。这次为了使用方便,介绍一下功能:
#coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/")
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
使用上面的代码,我们就可以正常抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
既然我们要模拟一个浏览器访问网页,这些参数自然需要我们在浏览器中搜索。
首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下框架,然后我们点击Network,然后我们会发现我们所在页面的信息确实不出现,没关系,这时候我们刷新页面,就会出现下图所示的信息。
这时候我们会在第一行看到51251757,这就是我们网页的URL后面的标签。这时候,当我们点击这个标签的时候,就会出现下图所示的内容:
这是我现在通过直接访问此 URL 获得的屏幕截图:
前两张图,我以前写的是版本2的访问,现在直接用了。当时我在csdn主页上点击了这个博客,所以我在代码中填写了referer,在我的header中填写了前两张图片。是的
,而这张图是我直接通过URL链接进入浏览器的,所以从图中可以看出,referer是,这是我们的网站,贴在这里是为了让大家更好的理解这个referer . 不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候千万不要使用我给的User-Agent,因为我用省略号替换了一些。每个人都应该用自己的方式来弥补。
这时候我们会找到Headers,有没有亮眼的感觉,是的,你的直觉是对的,我们需要的信息就在这个Headers里面。
然后,根据代码中需要的参数,把信息复制回来使用,因为这里显示的信息正好对应key值,所以我们复制使用非常方便。
现在介绍一下这个urllib.request.Request的用法(翻译自官方文档):
classurllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None) 参数: url:不用说,这是我们即将访问的网站,它是一个细绳。数据:数据必须是一个字节对象,指定要发送到服务器的附加数据,如果不需要,则为无。目前,只有 HTTP 请求使用数据;当提供数据参数时,HTTP 请求应该是 POST 而不是 GET。数据应以标准 application/x-www-form-urlencoded 格式缓冲。urllib.parse.urlencode() 函数采用映射或二进制序列并返回该格式的 ASCII 字符串。当用作数据参数时,应将其编码为字节。(我们暂时不会使用这个,所以不管它) headers:headers 是一个字符的典型数据。当使用键和值参数调用 add_header() 时,标头将作为请求处理。该标头通常用于防止爬虫访问服务器。header 是浏览器用来标识自己的,因为有些 HTTP 服务器只允许来自普通浏览器的请求,而不是脚本(可以理解为爬虫)。
这必然增加了网站服务器的处理负担,即一个网站必须在爬虫检测和网站服务器的计算负担之间做一个权衡,所以不是爬虫检测机制越严格越好,还要考虑服务器的负担。origin_req_host:origin_req_host 应该是原创事务请求的主机,由 RFC 2965 定义。默认为 http.cookiejar.request_host(self)。
这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是请求收录图像的页面的主机。(我们一般不用这个,这里就知道了) unverifiable:unverifiable 应该表示请求是否不可验证,由 RFC 2965 定义,默认值为 false。无法验证的请求是指无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器获取图片时,此时unverifiable应该为true。method:method 应该是一个字符串,指示要使用的 HTTP 请求方法(例如“header”)。如果提供,它的值存储在方法属性中,并通过方法 get_method() 调用。子类可以通过设置类的方法属性来指示默认方法。(这个基本不用)说了这么多无聊的定义,自己翻译都受不了了。让我们继续回到我们的程序:对于我们的程序,只需抓住几个要点。首先,我们需要构造一个请求:req =Request(url),这个时候请求是空的,我们需要在里面添加信息,给浏览器看。
req.add_header("User-Agent", random_header) 告诉网络服务器我正在通过浏览器访问,我不是爬虫。req.add_header("GET",url)是告诉浏览器我们访问的URL,req.add_header("Host","")是网站的信息,我们从网站开始随便填一下,req.add_header("Referer","")这句话很重要,它告诉网站服务器我们在哪里找到了我们要访问的网页,比如你点击了百度如果一个link跳转到当前访问的页面,referer是百度中的链接,是一种判断机制。对标头的构造函数也可以这样做:
#coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/")
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
如上程序所示,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent被写死了。其实我们可以发现,对于不同的电脑主机访问同一个网页时,我们的其他三个信息:GET、Host、Referer可能都是一样的。此时仅以User-Agent作为判断用户异同的标准。那么问题来了。如果我们从同学那里“借”一些User-Agent来使用,模拟多用户访问不是更有趣吗?其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agent,然后通过random函数随机选择一个组合起来创建一个用户。多路访问的错觉实际上非常有用。要知道,对于一个网站,当访问次数过多时,用户的ip会被屏蔽。这一点都不好玩,所以如果你想永久访问一个网站而不被抓住,还是需要很多技巧的。
当我们要爬取一个网站的多个网页时,由于主机访问频繁,很容易被网站检测到,进而被屏蔽。而如果我们在列表中加入更多不同的主机号,然后随机使用,是不是很容易被发现?当然,当我们为了防止这种情况,更好的方法是使用IP代理,因为我们不容易被发现。可以获得很多主机信息,IP代理也很容易从网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。 查看全部
浏览器抓取网页(用到一个神奇的库urllib.request.Request进行我们的模拟工作)
urllib.error.HTTPError:HTTP 错误 403:禁止
从403 Forbidden我们可以发现,此时网站禁止程序的访问,这是因为csdn网站已经设置了反爬虫机制,当网站检测到一个爬虫,访问会被拒绝,所以我们会得到上面的结果。
这时候我们需要模拟浏览器访问,为了避开网站的反爬虫机制,然后顺利抓取我们想要的内容。
接下来,我们将使用一个神奇的库 urllib.request.Request 进行我们的模拟工作。这次我们先代码再讲解,不过这次要提醒一下,下面的代码不能直接使用。其中my_headers中的User-Agent替换为我自己的。因为我加了省略号保密,所以不能直接使用。替换方法如下图所示。这次为了使用方便,介绍一下功能:
#coding:utf - 8
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
req =Request(url)
req.add_header("User-Agent", random_header)
req.add_header("GET",url)
req.add_header("Host","blog.csdn.net")
req.add_header("Referer","http://www.csdn.net/")
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53 。。。Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
使用上面的代码,我们就可以正常抓取到这个网页的信息了,接下来介绍如何获取我们的getContent函数中需要用到的headers中的参数。
既然我们要模拟一个浏览器访问网页,这些参数自然需要我们在浏览器中搜索。
首先我们点击进入要爬取的网页,然后右击页面,点击review元素,会出现如下框架,然后我们点击Network,然后我们会发现我们所在页面的信息确实不出现,没关系,这时候我们刷新页面,就会出现下图所示的信息。
这时候我们会在第一行看到51251757,这就是我们网页的URL后面的标签。这时候,当我们点击这个标签的时候,就会出现下图所示的内容:
这是我现在通过直接访问此 URL 获得的屏幕截图:
前两张图,我以前写的是版本2的访问,现在直接用了。当时我在csdn主页上点击了这个博客,所以我在代码中填写了referer,在我的header中填写了前两张图片。是的
,而这张图是我直接通过URL链接进入浏览器的,所以从图中可以看出,referer是,这是我们的网站,贴在这里是为了让大家更好的理解这个referer . 不一样的画面。在这张图中,我用红线标出了需要填写的四个内容。测试的时候千万不要使用我给的User-Agent,因为我用省略号替换了一些。每个人都应该用自己的方式来弥补。
这时候我们会找到Headers,有没有亮眼的感觉,是的,你的直觉是对的,我们需要的信息就在这个Headers里面。
然后,根据代码中需要的参数,把信息复制回来使用,因为这里显示的信息正好对应key值,所以我们复制使用非常方便。
现在介绍一下这个urllib.request.Request的用法(翻译自官方文档):
classurllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None) 参数: url:不用说,这是我们即将访问的网站,它是一个细绳。数据:数据必须是一个字节对象,指定要发送到服务器的附加数据,如果不需要,则为无。目前,只有 HTTP 请求使用数据;当提供数据参数时,HTTP 请求应该是 POST 而不是 GET。数据应以标准 application/x-www-form-urlencoded 格式缓冲。urllib.parse.urlencode() 函数采用映射或二进制序列并返回该格式的 ASCII 字符串。当用作数据参数时,应将其编码为字节。(我们暂时不会使用这个,所以不管它) headers:headers 是一个字符的典型数据。当使用键和值参数调用 add_header() 时,标头将作为请求处理。该标头通常用于防止爬虫访问服务器。header 是浏览器用来标识自己的,因为有些 HTTP 服务器只允许来自普通浏览器的请求,而不是脚本(可以理解为爬虫)。
这必然增加了网站服务器的处理负担,即一个网站必须在爬虫检测和网站服务器的计算负担之间做一个权衡,所以不是爬虫检测机制越严格越好,还要考虑服务器的负担。origin_req_host:origin_req_host 应该是原创事务请求的主机,由 RFC 2965 定义。默认为 http.cookiejar.request_host(self)。
这是用户发起的原创请求的主机名或 IP 地址。例如,如果请求是针对 HTML 文档中的图像,则这应该是请求收录图像的页面的主机。(我们一般不用这个,这里就知道了) unverifiable:unverifiable 应该表示请求是否不可验证,由 RFC 2965 定义,默认值为 false。无法验证的请求是指无法提交用户的 URL。例如,当用户在网页的html文档中找到一张图片,但用户没有权限从服务器获取图片时,此时unverifiable应该为true。method:method 应该是一个字符串,指示要使用的 HTTP 请求方法(例如“header”)。如果提供,它的值存储在方法属性中,并通过方法 get_method() 调用。子类可以通过设置类的方法属性来指示默认方法。(这个基本不用)说了这么多无聊的定义,自己翻译都受不了了。让我们继续回到我们的程序:对于我们的程序,只需抓住几个要点。首先,我们需要构造一个请求:req =Request(url),这个时候请求是空的,我们需要在里面添加信息,给浏览器看。
req.add_header("User-Agent", random_header) 告诉网络服务器我正在通过浏览器访问,我不是爬虫。req.add_header("GET",url)是告诉浏览器我们访问的URL,req.add_header("Host","")是网站的信息,我们从网站开始随便填一下,req.add_header("Referer","")这句话很重要,它告诉网站服务器我们在哪里找到了我们要访问的网页,比如你点击了百度如果一个link跳转到当前访问的页面,referer是百度中的链接,是一种判断机制。对标头的构造函数也可以这样做:
#coding:utf - 8
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.request import Request
import random
import re
def getContent(url,headers):
"""
此函数用于抓取返回403禁止访问的网页
"""
random_header = random.choice(headers)
"""
对于Request中的第二个参数headers,它是字典型参数,所以在传入时
也可以直接将个字典传入,字典中就是下面元组的键值对应
"""
# req =Request(url)
# req.add_header("User-Agent", random_header)
# req.add_header("GET",url)
# req.add_header("Host","blog.csdn.net")
# req.add_header("Referer","http://www.csdn.net/")
header = {"User-Agent": random_header, "GET": url, "Host": "blog.csdn.net", "Referer": "http://www.csdn.net/"}
req=Request(url,None,header)
content=urlopen(req).read().decode("utf-8")
return content
url="http://blog.csdn.net/beliefer/ ... ot%3B
#这里面的my_headers中的内容由于是个人主机的信息,所以我就用句号省略了一些,在使用时可以将自己主机的User-Agent放进去
my_headers = ["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/53。。。(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"]
print(getContent(url,my_headers))
如上程序所示,我们也可以直接构造header,但是这样做有一个缺陷,就是header中的User-Agent被写死了。其实我们可以发现,对于不同的电脑主机访问同一个网页时,我们的其他三个信息:GET、Host、Referer可能都是一样的。此时仅以User-Agent作为判断用户异同的标准。那么问题来了。如果我们从同学那里“借”一些User-Agent来使用,模拟多用户访问不是更有趣吗?其实这就是我刚开始的代码中的原因,所以有一个my_headers的列表,里面其实可以放多个User-Agent,然后通过random函数随机选择一个组合起来创建一个用户。多路访问的错觉实际上非常有用。要知道,对于一个网站,当访问次数过多时,用户的ip会被屏蔽。这一点都不好玩,所以如果你想永久访问一个网站而不被抓住,还是需要很多技巧的。
当我们要爬取一个网站的多个网页时,由于主机访问频繁,很容易被网站检测到,进而被屏蔽。而如果我们在列表中加入更多不同的主机号,然后随机使用,是不是很容易被发现?当然,当我们为了防止这种情况,更好的方法是使用IP代理,因为我们不容易被发现。可以获得很多主机信息,IP代理也很容易从网上搜索到。关于多次访问的问题我会在以后的博客中解释,这里就不多说了。
浏览器抓取网页(PHP手册(再次一句一句以强调)手册真乃圣经)
网站优化 • 优采云 发表了文章 • 0 个评论 • 37 次浏览 • 2022-01-12 11:11
抓取网页内容,PHP内置了几个可以实现的函数,如file()、file_get_contents()等,都支持URL参数。但是要实现更复杂的操作,这些函数就无能为力了。
cURL 是一个文件传输工具,它使用 URL 语法在命令行下工作。 cURL 提供了一个 PHP 扩展。使用此扩展,您可以完全模拟浏览器操作,就像使用浏览器浏览网页一样。可以设置header内容、设置cookie数据、POST数据、上传文件、设置代理等。其实我们这里讨论的爬取网页内容只是它常用的应用之一。
cURL 官方网站:
PHP cURL 扩展:
在 Windows 下添加这个扩展就像加载 php_curl.dll 一样简单。去掉php.ini文件extension=php_curl.dll前面的分号,将php_curl.dll复制到PHP扩展目录或者C:\Windows\system32目录下重启web服务器。 php_curl.dll 在 PHP 的 ZIP 包中提供。
在Linux下,需要先安装cURL。一种方法是编译成PHP,编译配置时加上--with-curl[=DIR]。另一种方法是将其编译成一个PHP模块来加载,编译cURL模块的方法和编译其他PHP模块的方法是一样的,以下是基本命令:
cd /path/to/php/source 进入PHP源码目录
cd ext/curl 进入cURL模块的源码目录
/usr/local/php/bin/phpize 生成编译配置文件
./configure --with-php-config=/usr/local/php/bin/php-config
制作
进行安装
编译完成生成curl.so,修改php.ini,加载模块:
extension="/path/to/extension/curl.so"
测试是否加载了cURL扩展,新建一个PHP文件:
网页抓取示例:
curl_setopt()可以设置很多选项,更多选项请参考PHP手册。
更多函数及其用法请参考PHP手册(再次强调PHP手册真的是圣经)。
转载于: 查看全部
浏览器抓取网页(PHP手册(再次一句一句以强调)手册真乃圣经)
抓取网页内容,PHP内置了几个可以实现的函数,如file()、file_get_contents()等,都支持URL参数。但是要实现更复杂的操作,这些函数就无能为力了。
cURL 是一个文件传输工具,它使用 URL 语法在命令行下工作。 cURL 提供了一个 PHP 扩展。使用此扩展,您可以完全模拟浏览器操作,就像使用浏览器浏览网页一样。可以设置header内容、设置cookie数据、POST数据、上传文件、设置代理等。其实我们这里讨论的爬取网页内容只是它常用的应用之一。
cURL 官方网站:
PHP cURL 扩展:
在 Windows 下添加这个扩展就像加载 php_curl.dll 一样简单。去掉php.ini文件extension=php_curl.dll前面的分号,将php_curl.dll复制到PHP扩展目录或者C:\Windows\system32目录下重启web服务器。 php_curl.dll 在 PHP 的 ZIP 包中提供。
在Linux下,需要先安装cURL。一种方法是编译成PHP,编译配置时加上--with-curl[=DIR]。另一种方法是将其编译成一个PHP模块来加载,编译cURL模块的方法和编译其他PHP模块的方法是一样的,以下是基本命令:
cd /path/to/php/source 进入PHP源码目录
cd ext/curl 进入cURL模块的源码目录
/usr/local/php/bin/phpize 生成编译配置文件
./configure --with-php-config=/usr/local/php/bin/php-config
制作
进行安装
编译完成生成curl.so,修改php.ini,加载模块:
extension="/path/to/extension/curl.so"
测试是否加载了cURL扩展,新建一个PHP文件:
网页抓取示例:
curl_setopt()可以设置很多选项,更多选项请参考PHP手册。
更多函数及其用法请参考PHP手册(再次强调PHP手册真的是圣经)。
转载于:
浏览器抓取网页(网页获取和解析速度和性能的应用场景详解! )
网站优化 • 优采云 发表了文章 • 0 个评论 • 54 次浏览 • 2022-01-11 13:14
)
(4)支持代理
(5)支持自动cookie管理等。
Java爬虫开发是应用最广泛的网页获取技术。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐用于快速访问网页。无需解析脚本和 CSS 的场景。
示例代码如下:
package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
汤
jsoup 是一个 Java HTML 解析器,可以直接解析一个 URL 地址和 HTML 文本内容。它提供了一个非常省力的 API,用于通过 DOM、CSS 和类似 jQuery 的操作方法获取和操作数据。
网页获取解析速度快,推荐。
主要功能如下:
1. 从 URL、文件或字符串解析 HTML;
2. 使用 DOM 或 CSS 选择器来查找和检索数据;
3. 可以操作 HTML 元素、属性、文本;
示例代码如下:
package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
html单元
htmlunit 是一个开源的java页面分析工具。阅读完页面后,可以有效地使用htmlunit分析页面上的内容。该项目可以模拟浏览器的操作,称为java浏览器的开源实现。这个没有界面的浏览器运行速度非常快。使用 Rhinojs 引擎。模拟js运行。
网页获取和解析速度快,性能更好。推荐用于需要解析网页脚本的应用场景。
示例代码如下:
package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
瓦蒂
Watij(发音为 wattage)是一个用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 使您能够在真实浏览器中自动测试 Web 应用程序。因为调用本地浏览器,所以支持CSS渲染和JS执行。
网页访问速度一般,IE版本太低(6/7)可能会导致内存泄漏。
示例代码如下:
package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
硒
Selenium 也是一个用于 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试与浏览器的兼容性——测试您的应用程序是否在不同的浏览器和操作系统上运行良好。测试系统功能 - 创建回归测试以验证软件功能和用户需求。支持动作的自动记录和自动生成。Net、Java、Perl 和其他不同语言的测试脚本。Selenium 是 ThoughtWorks 专门为 Web 应用程序编写的验收测试工具。
网页抓取速度慢,对于爬虫来说不是一个好的选择。
示例代码如下:
package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
网络规范
具有支持脚本执行和 CSS 呈现的界面的开源 Java 浏览器。平均速度。
示例代码如下:
package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}} 查看全部
浏览器抓取网页(网页获取和解析速度和性能的应用场景详解!
)
(4)支持代理
(5)支持自动cookie管理等。
Java爬虫开发是应用最广泛的网页获取技术。它具有一流的速度和性能。它在功能支持方面相对较低。不支持JS脚本执行、CSS解析、渲染等准浏览器功能。推荐用于快速访问网页。无需解析脚本和 CSS 的场景。
示例代码如下:
package cn.ysh.studio.crawler.httpclient;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;/**
* 基于HtmlClient抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHttpClientTest{publicstaticvoid main(String[] args)throwsException{//目标页面String url ="http://www.yshjava.cn";//创建一个默认的HttpClientHttpClient httpclient =newDefaultHttpClient();try{//以get方式请求网页http://www.yshjava.cnHttpGet httpget =newHttpGet(url);//打印请求地址System.out.println("executing request "+ httpget.getURI());//创建响应处理器处理服务器响应内容ResponseHandlerresponseHandler=newBasicResponseHandler();//执行请求并获取结果String responseBody = httpclient.execute(httpget, responseHandler);System.out.println("----------------------------------------");System.out.println(responseBody);System.out.println("----------------------------------------");}finally{//关闭连接管理器
httpclient.getConnectionManager().shutdown();}}}
汤
jsoup 是一个 Java HTML 解析器,可以直接解析一个 URL 地址和 HTML 文本内容。它提供了一个非常省力的 API,用于通过 DOM、CSS 和类似 jQuery 的操作方法获取和操作数据。
网页获取解析速度快,推荐。
主要功能如下:
1. 从 URL、文件或字符串解析 HTML;
2. 使用 DOM 或 CSS 选择器来查找和检索数据;
3. 可以操作 HTML 元素、属性、文本;
示例代码如下:
package cn.ysh.studio.crawler.jsoup;import java.io.IOException;import org.jsoup.Jsoup;/**
* 基于Jsoup抓取网页内容
* @author www.yshjava.cn
*/publicclassJsoupTest{publicstaticvoid main(String[] args)throwsIOException{//目标页面String url ="http://www.yshjava.cn";//使用Jsoup连接目标页面,并执行请求,获取服务器响应内容String html =Jsoup.connect(url).execute().body();//打印页面内容System.out.println(html);}}
html单元
htmlunit 是一个开源的java页面分析工具。阅读完页面后,可以有效地使用htmlunit分析页面上的内容。该项目可以模拟浏览器的操作,称为java浏览器的开源实现。这个没有界面的浏览器运行速度非常快。使用 Rhinojs 引擎。模拟js运行。
网页获取和解析速度快,性能更好。推荐用于需要解析网页脚本的应用场景。
示例代码如下:
package cn.ysh.studio.crawler.htmlunit;import com.gargoylesoftware.htmlunit.BrowserVersion;import com.gargoylesoftware.htmlunit.Page;import com.gargoylesoftware.htmlunit.WebClient;/**
* 基于HtmlUnit抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlUnitSpider{publicstaticvoid main(String[] s)throwsException{//目标网页String url ="http://www.yshjava.cn";//模拟特定浏览器FIREFOX_3WebClient spider =newWebClient(BrowserVersion.FIREFOX_3);//获取目标网页Page page = spider.getPage(url);//打印网页内容System.out.println(page.getWebResponse().getContentAsString());//关闭所有窗口
spider.closeAllWindows();}}
瓦蒂
Watij(发音为 wattage)是一个用 Java 开发的 Web 应用程序测试工具。鉴于 Watij 的简单性和 Java 语言的强大功能,Watij 使您能够在真实浏览器中自动测试 Web 应用程序。因为调用本地浏览器,所以支持CSS渲染和JS执行。
网页访问速度一般,IE版本太低(6/7)可能会导致内存泄漏。
示例代码如下:
package cn.ysh.studio.crawler.ie;import watij.runtime.ie.IE;/**
* 基于Watij抓取网页内容,仅限Windows平台
*
* @author www.yshjava.cn
*/publicclassWatijTest{publicstaticvoid main(String[] s){//目标页面String url ="http://www.yshjava.cn";//实例化IE浏览器对象
IE ie =new IE();try{//启动浏览器
ie.start();//转到目标网页
ie.goTo(url);//等待网页加载就绪
ie.waitUntilReady();//打印页面内容System.out.println(ie.html());}catch(Exception e){
e.printStackTrace();}finally{try{//关闭IE浏览器
ie.close();}catch(Exception e){}}}}
硒
Selenium 也是一个用于 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试与浏览器的兼容性——测试您的应用程序是否在不同的浏览器和操作系统上运行良好。测试系统功能 - 创建回归测试以验证软件功能和用户需求。支持动作的自动记录和自动生成。Net、Java、Perl 和其他不同语言的测试脚本。Selenium 是 ThoughtWorks 专门为 Web 应用程序编写的验收测试工具。
网页抓取速度慢,对于爬虫来说不是一个好的选择。
示例代码如下:
package cn.ysh.studio.crawler.selenium;import org.openqa.selenium.htmlunit.HtmlUnitDriver;/**
* 基于HtmlDriver抓取网页内容
*
* @author www.yshjava.cn
*/publicclassHtmlDriverTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";HtmlUnitDriver driver =newHtmlUnitDriver();try{//禁用JS脚本功能
driver.setJavascriptEnabled(false);//打开目标网页
driver.get(url);//获取当前网页源码String html = driver.getPageSource();//打印网页源码System.out.println(html);}catch(Exception e){//打印堆栈信息
e.printStackTrace();}finally{try{//关闭并退出
driver.close();
driver.quit();}catch(Exception e){}}}}
网络规范
具有支持脚本执行和 CSS 呈现的界面的开源 Java 浏览器。平均速度。
示例代码如下:
package cn.ysh.studio.crawler.webspec;import org.watij.webspec.dsl.WebSpec;/**
* 基于WebSpec抓取网页内容
*
* @author www.yshjava.cn
*/publicclassWebspecTest{publicstaticvoid main(String[] s){//目标网页String url ="http://www.yshjava.cn";//实例化浏览器对象WebSpec spec =newWebSpec().mozilla();//隐藏浏览器窗体
spec.hide();//打开目标页面
spec.open(url);//打印网页源码System.out.println(spec.source());//关闭所有窗口
spec.closeAll();}}
浏览器抓取网页(几个抓取算法:1、宽度优先抓取策略(组图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2022-01-11 13:14
搜索引擎如何抓取网页 搜索引擎看似简单的抓取-入库-查询工作,但每个链接中隐含的算法却非常复杂。搜索引擎依靠蜘蛛来完成爬取页面的工作。爬取动作很容易实现,但是先爬哪些页面,先爬哪些页面需要算法来决定。下面介绍几种爬取算法:1、广度优先爬取策略:我们都知道网站页面大部分是按照树形图分布的,所以在树形图的链接结构中,页面会先被爬取吗?为什么要优先抓取这些页面?广度优先爬取策略是先按照树形图结构爬取同级链接,然后在同级链接爬取完成后,再爬取下一级链接。如下图: 可以看到,我在表达的时候,使用的是链接结构,而不是网站结构。这里的链接结构可以收录任何页面的链接,不一定是网站内部链接。这是一种理想化的广度优先抓取策略。在实际抓取过程中,不可能先想到全宽,而是先限制宽,如下图所示: 上图中,我们的蜘蛛在检索G链接的时候,通过算法发现G页面没有价值,所以悲剧的G链接和低级的H链接被Spider协调。至于为什么G链接是和谐的?好吧,我们来分析一下。2、不完整的遍历链路权重计算:
互联网几乎是无限的,每天都会产生大量的新链接。搜索引擎对链接权重的计算只能是不完全遍历。为什么 Google PR 需要每三个月更新一次?为什么百度一个月更新一两次?这是因为搜索引擎使用非完全遍历链接权重算法来计算链接权重。其实按照现在的技术,实现更快的频率权重更新并不难,计算速度和存储速度完全可以跟上,但为什么不去做呢?因为没那么必要,或者已经实现了,但是我不想发布。那么,什么是非完整遍历链路权重计算呢?我们形成一组K个链接,R代表链接获得的pagerank,S代表链接收录的链接数量,Q代表是否参与传递,β代表阻尼因子,则链接得到的权重计算公式为: 从公式可以看出Q决定链接重量。如果发现链接作弊,或者搜索引擎被手动删除,或者其他原因,将Q设置为0,那么再多的外部链接就没用了。β为阻尼因子,其主要作用是防止权重0的出现,使链路无法参与权重传递,防止作弊的出现。阻尼系数β一般为0.85。为什么阻尼因子乘以网站的个数?因为不是一个页面中的所有页面都参与权重转移,所以搜索引擎会再次删除 15% 的已过滤链接。
因此,在此基础上,出现了实时权重分布抓取策略。即蜘蛛爬完页面并进入后,立即进行权重分配,将权重重新分配给要爬取的链接库,然后蜘蛛根据权重进行爬取。3、社会工程抓取策略 社会工程策略是在蜘蛛爬行的过程中加入人工智能或经过人工智能训练的机器智能来确定爬行的优先级。目前我知道的爬取策略有:热点优先策略:针对爆破热点关键词优先抓取,不需要经过严格的去重和过滤,因为会有新的链接覆盖和用户的主动选择。湾。权限优先策略:搜索引擎会给每一个网站分配一个权威度,通过网站历史、网站更新等确定网站的权威度,取权威度高的网站 链接。C。用户点击策略:当大多数在行业词库中搜索关键词,并且经常点击同一网站的搜索结果时,搜索引擎会更频繁地抓取这个网站。d。历史参考策略:对于不断更新频繁的网站,搜索引擎会为网站建立更新历史,并根据更新历史估计未来更新量,确定爬取频率。SEO工作指导:搜索引擎爬取原理已经深入讲解,所以现在有必要说明一下这些原则对SEO工作的指导作用: A. 定期定量的更新,让蜘蛛按时爬到网站页面;B.公司运营网站比个人网站更有权威性;C、网站建站时间长,更容易被爬取;D. 链接在页面中分布要合理,太多或太少都不好;E、受用户欢迎的网站也受搜索引擎欢迎;F、重要的页面应该放在较浅的网站结构中;G、网站中的行业权限信息会增加网站的权限。本教程就是这样,下一篇教程的主题是:页面价值和网站权重的计算。 查看全部
浏览器抓取网页(几个抓取算法:1、宽度优先抓取策略(组图))
搜索引擎如何抓取网页 搜索引擎看似简单的抓取-入库-查询工作,但每个链接中隐含的算法却非常复杂。搜索引擎依靠蜘蛛来完成爬取页面的工作。爬取动作很容易实现,但是先爬哪些页面,先爬哪些页面需要算法来决定。下面介绍几种爬取算法:1、广度优先爬取策略:我们都知道网站页面大部分是按照树形图分布的,所以在树形图的链接结构中,页面会先被爬取吗?为什么要优先抓取这些页面?广度优先爬取策略是先按照树形图结构爬取同级链接,然后在同级链接爬取完成后,再爬取下一级链接。如下图: 可以看到,我在表达的时候,使用的是链接结构,而不是网站结构。这里的链接结构可以收录任何页面的链接,不一定是网站内部链接。这是一种理想化的广度优先抓取策略。在实际抓取过程中,不可能先想到全宽,而是先限制宽,如下图所示: 上图中,我们的蜘蛛在检索G链接的时候,通过算法发现G页面没有价值,所以悲剧的G链接和低级的H链接被Spider协调。至于为什么G链接是和谐的?好吧,我们来分析一下。2、不完整的遍历链路权重计算:
互联网几乎是无限的,每天都会产生大量的新链接。搜索引擎对链接权重的计算只能是不完全遍历。为什么 Google PR 需要每三个月更新一次?为什么百度一个月更新一两次?这是因为搜索引擎使用非完全遍历链接权重算法来计算链接权重。其实按照现在的技术,实现更快的频率权重更新并不难,计算速度和存储速度完全可以跟上,但为什么不去做呢?因为没那么必要,或者已经实现了,但是我不想发布。那么,什么是非完整遍历链路权重计算呢?我们形成一组K个链接,R代表链接获得的pagerank,S代表链接收录的链接数量,Q代表是否参与传递,β代表阻尼因子,则链接得到的权重计算公式为: 从公式可以看出Q决定链接重量。如果发现链接作弊,或者搜索引擎被手动删除,或者其他原因,将Q设置为0,那么再多的外部链接就没用了。β为阻尼因子,其主要作用是防止权重0的出现,使链路无法参与权重传递,防止作弊的出现。阻尼系数β一般为0.85。为什么阻尼因子乘以网站的个数?因为不是一个页面中的所有页面都参与权重转移,所以搜索引擎会再次删除 15% 的已过滤链接。
因此,在此基础上,出现了实时权重分布抓取策略。即蜘蛛爬完页面并进入后,立即进行权重分配,将权重重新分配给要爬取的链接库,然后蜘蛛根据权重进行爬取。3、社会工程抓取策略 社会工程策略是在蜘蛛爬行的过程中加入人工智能或经过人工智能训练的机器智能来确定爬行的优先级。目前我知道的爬取策略有:热点优先策略:针对爆破热点关键词优先抓取,不需要经过严格的去重和过滤,因为会有新的链接覆盖和用户的主动选择。湾。权限优先策略:搜索引擎会给每一个网站分配一个权威度,通过网站历史、网站更新等确定网站的权威度,取权威度高的网站 链接。C。用户点击策略:当大多数在行业词库中搜索关键词,并且经常点击同一网站的搜索结果时,搜索引擎会更频繁地抓取这个网站。d。历史参考策略:对于不断更新频繁的网站,搜索引擎会为网站建立更新历史,并根据更新历史估计未来更新量,确定爬取频率。SEO工作指导:搜索引擎爬取原理已经深入讲解,所以现在有必要说明一下这些原则对SEO工作的指导作用: A. 定期定量的更新,让蜘蛛按时爬到网站页面;B.公司运营网站比个人网站更有权威性;C、网站建站时间长,更容易被爬取;D. 链接在页面中分布要合理,太多或太少都不好;E、受用户欢迎的网站也受搜索引擎欢迎;F、重要的页面应该放在较浅的网站结构中;G、网站中的行业权限信息会增加网站的权限。本教程就是这样,下一篇教程的主题是:页面价值和网站权重的计算。
浏览器抓取网页(关键词的提取和转载和修改再带来的便利性)
网站优化 • 优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2022-01-11 13:12
搜索引擎在抓取大量原创网页时,会进行预处理,主要包括四个方面,关键词的提取,“镜像网页”(网页内容完全一致)未经任何修改)或“转载网页”。”(近副本,主题内容基本相同但可能有一些额外的编辑信息等,转载的页面也称为“近似镜像页面”)消除,链接分析和页面的重要性计算。
提取1.关键词,取一个网页的源文件(比如通过浏览器的“查看源文件”功能),可以看出情况比较复杂。从知识和实践的角度来看,收录的关键词就是这个特性的最佳代表。因此,作为预处理阶段的一项基本任务,就是提取网页源文件内容部分收录的关键词。对于中文来说,就是使用所谓的“切字软件”,根据字典Σ从网页文本中剪出Σ中收录的单词。之后,一个网页主要由一组词来近似,p = {t1, t2, ..., tn}。一般来说,我们可能会得到很多词,而同一个词可能会在一个网页中出现多次。从有效性和效率的角度来看,所有的词都不应该出现在网页的表示中。“de”、“in”等没有表示意义的内容的词要去掉,称为“停用词”。”(停用词)。这样,对于一个网页来说,有效词的数量大约是 200 个。
2. 消除重复或转载网页,固有的数字化和网络化为网页的复制、转载和再版带来了便利,因此我们在网络上看到了大量的重复信息。这种现象对广大网民来说是积极的,因为有更多的机会获取信息。但对于搜索引擎来说,主要是负面的;不仅在采集网页时会消耗机器时间和网络带宽资源,而且如果出现在查询结果中,会毫无意义地消耗电脑屏幕资源,还会招来用户的抱怨,“这么多重复,给我一个就够了”。因此,剔除具有重复内容或主题内容的网页是搜索引擎在网页抓取阶段的一项重要工作。
3、链接分析,大量的HTML标签不仅给网页的预处理带来了一些麻烦,也带来了一些新的机会。从信息检索的角度来看,如果系统只处理内容的文本,我们可以依靠的是“shared bag of words”(共享词袋),即关键词@的集合> 收录在内容中,最多加上一个词条在文档集合中的词条频率(或tf,TF)和文档频率(document frequency 或df,DF)等统计信息。而 TF 和 DF 等频率信息可以在一定程度上表明词在文档中的相对重要性或某些内容的相关性,这是有意义的。使用 HTML 标签,情况可能会进一步改善,例如在同一个文档中,和之间的信息可能比和之间的信息更重要。特别是HTML文档中收录的其他文档的链接信息是近年来特别关注的对象,相信它们不仅给出了网页之间的关系,而且在判断网页内容方面也起着重要作用。页。
4、网页重要性的计算,搜索引擎其实追求的是一种统计意义上的满足感。人们认为谷歌目前比百度好,或者百度比谷歌好,参考取决于前者返回的内容在大多数情况下更符合用户的需求,但并非在所有情况下。查询结果的排序方式需要考虑很多因素。如何说一个网页比另一个网页更重要?人们引用科学文献重要性的评价方法,其核心思想是“被引用越多越重要”。通过 HTML 超链接,网页之间可以很好地体现“引用”的概念。PageRank,这是谷歌创造的核心技术,是这一理念的成功体现。此外,人们还注意到网页和文档的不同特点,即有的网页主要链接大量的外部链接,基本没有明确的主题内容,而其他网页则以链接方式链接。大量其他网页。从某种意义上说,这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 有的网页主要链接大量的外部链接,基本没有明确的主题内容,而有的网页则是由大量的其他网页链接而成。从某种意义上说,这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 有的网页主要链接大量的外部链接,基本没有明确的主题内容,而有的网页则是由大量的其他网页链接而成。从某种意义上说,这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分.
这篇文章的链接: 查看全部
浏览器抓取网页(关键词的提取和转载和修改再带来的便利性)
搜索引擎在抓取大量原创网页时,会进行预处理,主要包括四个方面,关键词的提取,“镜像网页”(网页内容完全一致)未经任何修改)或“转载网页”。”(近副本,主题内容基本相同但可能有一些额外的编辑信息等,转载的页面也称为“近似镜像页面”)消除,链接分析和页面的重要性计算。
提取1.关键词,取一个网页的源文件(比如通过浏览器的“查看源文件”功能),可以看出情况比较复杂。从知识和实践的角度来看,收录的关键词就是这个特性的最佳代表。因此,作为预处理阶段的一项基本任务,就是提取网页源文件内容部分收录的关键词。对于中文来说,就是使用所谓的“切字软件”,根据字典Σ从网页文本中剪出Σ中收录的单词。之后,一个网页主要由一组词来近似,p = {t1, t2, ..., tn}。一般来说,我们可能会得到很多词,而同一个词可能会在一个网页中出现多次。从有效性和效率的角度来看,所有的词都不应该出现在网页的表示中。“de”、“in”等没有表示意义的内容的词要去掉,称为“停用词”。”(停用词)。这样,对于一个网页来说,有效词的数量大约是 200 个。
2. 消除重复或转载网页,固有的数字化和网络化为网页的复制、转载和再版带来了便利,因此我们在网络上看到了大量的重复信息。这种现象对广大网民来说是积极的,因为有更多的机会获取信息。但对于搜索引擎来说,主要是负面的;不仅在采集网页时会消耗机器时间和网络带宽资源,而且如果出现在查询结果中,会毫无意义地消耗电脑屏幕资源,还会招来用户的抱怨,“这么多重复,给我一个就够了”。因此,剔除具有重复内容或主题内容的网页是搜索引擎在网页抓取阶段的一项重要工作。
3、链接分析,大量的HTML标签不仅给网页的预处理带来了一些麻烦,也带来了一些新的机会。从信息检索的角度来看,如果系统只处理内容的文本,我们可以依靠的是“shared bag of words”(共享词袋),即关键词@的集合> 收录在内容中,最多加上一个词条在文档集合中的词条频率(或tf,TF)和文档频率(document frequency 或df,DF)等统计信息。而 TF 和 DF 等频率信息可以在一定程度上表明词在文档中的相对重要性或某些内容的相关性,这是有意义的。使用 HTML 标签,情况可能会进一步改善,例如在同一个文档中,和之间的信息可能比和之间的信息更重要。特别是HTML文档中收录的其他文档的链接信息是近年来特别关注的对象,相信它们不仅给出了网页之间的关系,而且在判断网页内容方面也起着重要作用。页。
4、网页重要性的计算,搜索引擎其实追求的是一种统计意义上的满足感。人们认为谷歌目前比百度好,或者百度比谷歌好,参考取决于前者返回的内容在大多数情况下更符合用户的需求,但并非在所有情况下。查询结果的排序方式需要考虑很多因素。如何说一个网页比另一个网页更重要?人们引用科学文献重要性的评价方法,其核心思想是“被引用越多越重要”。通过 HTML 超链接,网页之间可以很好地体现“引用”的概念。PageRank,这是谷歌创造的核心技术,是这一理念的成功体现。此外,人们还注意到网页和文档的不同特点,即有的网页主要链接大量的外部链接,基本没有明确的主题内容,而其他网页则以链接方式链接。大量其他网页。从某种意义上说,这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 有的网页主要链接大量的外部链接,基本没有明确的主题内容,而有的网页则是由大量的其他网页链接而成。从某种意义上说,这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 有的网页主要链接大量的外部链接,基本没有明确的主题内容,而有的网页则是由大量的其他网页链接而成。从某种意义上说,这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分. 这形成了一种二元关系,允许人们在网页上建立另一种重要性度量。这些指标有的可以在爬取网页的阶段计算,有的需要在查询的阶段计算,但都在查询服务阶段作为最终形成结果排名的参数的一部分.
这篇文章的链接:
浏览器抓取网页(浏览器英语:HTTPS拦截证书的编码方式不一样(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 52 次浏览 • 2022-01-10 19:17
有一个问题,第一步是什么?
我当然要去官方网站找FAQ和帮助,先练英文
注意思路,burp提供der格式的证书,必须先导入浏览器,再从浏览器导出cer格式的证书
测试环境
[+] JDK1.8.0_162
[+] Burp Suite 1.7.26
一、打嗝介绍
请自行查看
在使用Burp站点拦截HTTPS的时候,他会提示你的连接不是私有连接或者这个连接不被信任等。这是因为burp一般默认只抓HTTP包。无法使用 HTTPS,因为它收录证书。正常爬取需要设置可信证书来抓取HTTPS数据包。
二、配置1、配置浏览器代理(目前支持:IE、Firefox、Chrome、Safari、iPhone、Android)
以Chrome为例:设置---->显示高级设置---->网络---->更改代理设置
--->点击局域网设置
--->输入后点击确定。
2、访问,下载burp的内置证书
--->下载后
证书为cacert.der,后缀为.der文件(证书的编码方式不同)。此文件不是常规的 .cer 证书文件。下面是让浏览器信任我们刚刚导出的证书。
3、导入证书
Chrome - 设置 - 高级 - HTTPS/SSL
--->点击Manage Certificates,所有浏览器都必须将PortSwiggerCA.crt证书安装到“Trusted Root Certification Authorities”中
--->点击导入
--->下一步
--->下一步
--->下一步
--->点击完成
--->刚才导入cacert.der文件,那么服务器中就会有一个类似“PortSwigger CA”(burp的内置证书)的证书,然后选择导出
--->下一步
--->下一步
--->下一步
4、相信这个证书
在证书颁发机构中导入刚才的PortSwiggerCA.crt文件,选择【信任使用此CA标志的网站】
--->点击导入
--->下一步
--->下一步
--->下一步
--->点击确定,然后重启,就这样,测试访问:
--->还有一种方法:
--->打开 Burp 站点
--->选择第一个选项并保存在本地
--->点击NEXT,然后找到证书并导入Chrome。 查看全部
浏览器抓取网页(浏览器英语:HTTPS拦截证书的编码方式不一样(图))
有一个问题,第一步是什么?
我当然要去官方网站找FAQ和帮助,先练英文
注意思路,burp提供der格式的证书,必须先导入浏览器,再从浏览器导出cer格式的证书
测试环境
[+] JDK1.8.0_162
[+] Burp Suite 1.7.26
一、打嗝介绍
请自行查看
在使用Burp站点拦截HTTPS的时候,他会提示你的连接不是私有连接或者这个连接不被信任等。这是因为burp一般默认只抓HTTP包。无法使用 HTTPS,因为它收录证书。正常爬取需要设置可信证书来抓取HTTPS数据包。

二、配置1、配置浏览器代理(目前支持:IE、Firefox、Chrome、Safari、iPhone、Android)
以Chrome为例:设置---->显示高级设置---->网络---->更改代理设置

--->点击局域网设置

--->输入后点击确定。
2、访问,下载burp的内置证书

--->下载后

证书为cacert.der,后缀为.der文件(证书的编码方式不同)。此文件不是常规的 .cer 证书文件。下面是让浏览器信任我们刚刚导出的证书。
3、导入证书
Chrome - 设置 - 高级 - HTTPS/SSL

--->点击Manage Certificates,所有浏览器都必须将PortSwiggerCA.crt证书安装到“Trusted Root Certification Authorities”中

--->点击导入

--->下一步

--->下一步

--->下一步

--->点击完成

--->刚才导入cacert.der文件,那么服务器中就会有一个类似“PortSwigger CA”(burp的内置证书)的证书,然后选择导出

--->下一步

--->下一步

--->下一步

4、相信这个证书
在证书颁发机构中导入刚才的PortSwiggerCA.crt文件,选择【信任使用此CA标志的网站】

--->点击导入

--->下一步

--->下一步

--->下一步

--->点击确定,然后重启,就这样,测试访问:

--->还有一种方法:
--->打开 Burp 站点

--->选择第一个选项并保存在本地


--->点击NEXT,然后找到证书并导入Chrome。
浏览器抓取网页(从IE浏览器获取当前页面内容可能有多种方式的介绍 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2022-01-10 17:19
)
从IE浏览器获取当前页面内容的方法可能有很多种,今天就介绍其中的一种。基本原理:鼠标点击当前IE页面时,获取鼠标的坐标位置,根据鼠标位置获取当前页面的句柄,然后根据句柄调用win32的东西获取页面内容。具体代码:
1 private void timer1_Tick(object sender, EventArgs e)
2 {
3 lock (currentLock)
4 {
5 System.Drawing.Point MousePoint = System.Windows.Forms.Form.MousePosition;
6 if (_leftClick)
7 {
8 timer1.Stop();
9 _leftClick = false;
10
11 _lastDocument = GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false));
12 if (_lastDocument != null)
13 {
14 if (_getDocument)
15 {
16 _getDocument = true;
17 try
18 {
19 string url = _lastDocument.url;
20 string html = _lastDocument.documentElement.outerHTML;
21 string cookie = _lastDocument.cookie;
22 string domain = _lastDocument.domain;
23
24 var resolveParams = new ResolveParam
25 {
26 Url = new Uri(url),
27 Html = html,
28 PageCookie = cookie,
29 Domain = domain
30 };
31
32 RequetResove(resolveParams);
33 }
34 catch (Exception ex)
35 {
36 System.Windows.MessageBox.Show(ex.Message);
37 Console.WriteLine(ex.Message);
38 Console.WriteLine(ex.StackTrace);
39 }
40 }
41 }
42 else
43 {
44 new MessageTip().Show("xx", "当前页面不是IE浏览器页面,或使用了非IE内核浏览器,如火狐,搜狗等。请使用IE浏览器打开网页");
45 }
46
47 _getDocument = false;
48 }
49 else
50 {
51 _pointFrm.Left = MousePoint.X + 10;
52 _pointFrm.Top = MousePoint.Y + 10;
53 }
54 }
55
56 }
在第11行GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false))的分解下,首先从鼠标坐标获取页面句柄:
1 public static IntPtr GetPointControl(System.Drawing.Point p, bool allControl)
2 {
3 IntPtr handle = Win32APIsFull.WindowFromPoint(p);
4 if (handle != IntPtr.Zero)
5 {
6 System.Drawing.Rectangle rect = default(System.Drawing.Rectangle);
7 if (Win32APIsFull.GetWindowRect(handle, out rect))
8 {
9 return Win32APIsFull.ChildWindowFromPointEx(handle, new System.Drawing.Point(p.X - rect.X, p.Y - rect.Y), allControl ? Win32APIsFull.CWP.ALL : Win32APIsFull.CWP.SKIPINVISIBLE);
10 }
11 }
12 return IntPtr.Zero;
13
14 }
接下来根据句柄获取页面内容:
1 public static HTMLDocument GetHTMLDocumentFormHwnd(IntPtr hwnd)
2 {
3 IntPtr result = Marshal.AllocHGlobal(4);
4 Object obj = null;
5
6 Console.WriteLine(Win32APIsFull.SendMessageTimeoutA(hwnd, HTML_GETOBJECT_mid, 0, 0, 2, 1000, result));
7 if (Marshal.ReadInt32(result) != 0)
8 {
9 Console.WriteLine(Win32APIsFull.ObjectFromLresult(Marshal.ReadInt32(result), ref IID_IHTMLDocument, 0, out obj));
10 }
11
12 Marshal.FreeHGlobal(result);
13
14 return obj as HTMLDocument;
15 }
一般原则:
向IE窗体发送消息,获取指向IE浏览器内存块的指针(非托管),然后根据该指针获取HTMLDocument对象。
该方法涉及win32的两个功能:
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "SendMessageTimeoutA")]
public static extern int SendMessageTimeoutA(
[InAttribute()] System.IntPtr hWnd,
uint Msg, uint wParam, int lParam,
uint fuFlags,
uint uTimeout,
System.IntPtr lpdwResult);
[System.Runtime.InteropServices.DllImportAttribute("oleacc.dll", EntryPoint = "ObjectFromLresult")]
public static extern int ObjectFromLresult(
int lResult,
ref Guid riid,
int wParam,
[MarshalAs(UnmanagedType.IDispatch), Out]
out Object pObject
); 查看全部
浏览器抓取网页(从IE浏览器获取当前页面内容可能有多种方式的介绍
)
从IE浏览器获取当前页面内容的方法可能有很多种,今天就介绍其中的一种。基本原理:鼠标点击当前IE页面时,获取鼠标的坐标位置,根据鼠标位置获取当前页面的句柄,然后根据句柄调用win32的东西获取页面内容。具体代码:
1 private void timer1_Tick(object sender, EventArgs e)
2 {
3 lock (currentLock)
4 {
5 System.Drawing.Point MousePoint = System.Windows.Forms.Form.MousePosition;
6 if (_leftClick)
7 {
8 timer1.Stop();
9 _leftClick = false;
10
11 _lastDocument = GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false));
12 if (_lastDocument != null)
13 {
14 if (_getDocument)
15 {
16 _getDocument = true;
17 try
18 {
19 string url = _lastDocument.url;
20 string html = _lastDocument.documentElement.outerHTML;
21 string cookie = _lastDocument.cookie;
22 string domain = _lastDocument.domain;
23
24 var resolveParams = new ResolveParam
25 {
26 Url = new Uri(url),
27 Html = html,
28 PageCookie = cookie,
29 Domain = domain
30 };
31
32 RequetResove(resolveParams);
33 }
34 catch (Exception ex)
35 {
36 System.Windows.MessageBox.Show(ex.Message);
37 Console.WriteLine(ex.Message);
38 Console.WriteLine(ex.StackTrace);
39 }
40 }
41 }
42 else
43 {
44 new MessageTip().Show("xx", "当前页面不是IE浏览器页面,或使用了非IE内核浏览器,如火狐,搜狗等。请使用IE浏览器打开网页");
45 }
46
47 _getDocument = false;
48 }
49 else
50 {
51 _pointFrm.Left = MousePoint.X + 10;
52 _pointFrm.Top = MousePoint.Y + 10;
53 }
54 }
55
56 }
在第11行GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false))的分解下,首先从鼠标坐标获取页面句柄:
1 public static IntPtr GetPointControl(System.Drawing.Point p, bool allControl)
2 {
3 IntPtr handle = Win32APIsFull.WindowFromPoint(p);
4 if (handle != IntPtr.Zero)
5 {
6 System.Drawing.Rectangle rect = default(System.Drawing.Rectangle);
7 if (Win32APIsFull.GetWindowRect(handle, out rect))
8 {
9 return Win32APIsFull.ChildWindowFromPointEx(handle, new System.Drawing.Point(p.X - rect.X, p.Y - rect.Y), allControl ? Win32APIsFull.CWP.ALL : Win32APIsFull.CWP.SKIPINVISIBLE);
10 }
11 }
12 return IntPtr.Zero;
13
14 }
接下来根据句柄获取页面内容:
1 public static HTMLDocument GetHTMLDocumentFormHwnd(IntPtr hwnd)
2 {
3 IntPtr result = Marshal.AllocHGlobal(4);
4 Object obj = null;
5
6 Console.WriteLine(Win32APIsFull.SendMessageTimeoutA(hwnd, HTML_GETOBJECT_mid, 0, 0, 2, 1000, result));
7 if (Marshal.ReadInt32(result) != 0)
8 {
9 Console.WriteLine(Win32APIsFull.ObjectFromLresult(Marshal.ReadInt32(result), ref IID_IHTMLDocument, 0, out obj));
10 }
11
12 Marshal.FreeHGlobal(result);
13
14 return obj as HTMLDocument;
15 }
一般原则:

向IE窗体发送消息,获取指向IE浏览器内存块的指针(非托管),然后根据该指针获取HTMLDocument对象。
该方法涉及win32的两个功能:
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "SendMessageTimeoutA")]
public static extern int SendMessageTimeoutA(
[InAttribute()] System.IntPtr hWnd,
uint Msg, uint wParam, int lParam,
uint fuFlags,
uint uTimeout,
System.IntPtr lpdwResult);
[System.Runtime.InteropServices.DllImportAttribute("oleacc.dll", EntryPoint = "ObjectFromLresult")]
public static extern int ObjectFromLresult(
int lResult,
ref Guid riid,
int wParam,
[MarshalAs(UnmanagedType.IDispatch), Out]
out Object pObject
);
浏览器抓取网页(PYTHON的安装(已安装,可跳过此步骤))
网站优化 • 优采云 发表了文章 • 0 个评论 • 121 次浏览 • 2022-01-09 15:03
(一)PYTHON安装(已经安装,可以跳过此步)
1、PYTHON下载
PYTHON官网:
根据对应系统下载,这里是window系统,点击windows,根据自己系统的操作位数下载
添加环境变量:
如果没有添加,可以自己在电脑上添加
(二)安装第三方库
安装selenium和pyquery,cmd命令下输入pip install selenium(pyquery安装类似)
如果报错,进入python目录下的scripts目录,然后输入命令
如果python的IDLE下没有报错,说明安装成功
(三)浏览器及对应浏览器驱动的安装
这里主要使用chrome浏览器,去谷歌官网下载安装,安装后查看谷歌版本,点击关于谷歌浏览器
(通常在这里找到)
我的版本:67.0
下载对应的webdriver(这里没有人推测每3个版本对应一个v65-67---v2.38,即v68-70--v2.39)
下载链接:
将下载好的chromedriver.exe解压,放到python36目录下(或者python36目录下的脚本)
IDLE下执行以下代码,会自动打开你的谷歌浏览器(环境搭建)
(四)详细示例代码
需求:爬取股票网站信息((“好”或“坏”)和“相关股票”),点击加载更多
(1)打开浏览器获取相关信息:
(2)网页分析(selenium有很多定位方式,这里用的比较少)
上述代码中,data已经拥有了网页当前页面的所有内容(可以输出观察);我们现在只需要从中获取我们想要的数据
在网页中,右键,检查元素,(或检查)分析网页:(由于获取的数据可能与网页分析的数据不同,建议输出数据并分析正则表达式从数据)
我们使用正则表达式查找所有以 1 开头并以 2 结尾的内容并使用 findall 函数
实现点击:(点击后“好股”和“相关股”的规律会与首页不同(后期点击与第一次点击相同))
定位方法如下:(用的比较少,这里就不详细介绍了,大家自己理解):
当您知道元素的 id 属性时使用 find_element_by_id 。使用此策略,将返回 id 属性值与位置匹配的第一个元素。
当您知道元素的名称属性时使用 find_element_by_name。使用此策略,将返回 id 属性值与位置匹配的第一个元素。
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
附上源代码:
#coding=utf-8
from selenium import webdriver
import time
import re
from pyquery import PyQuery as pq
def openurl(url,num):
browser = webdriver.Chrome() #打开浏览器
browser.get(url) #进入相关网站
html=browser.page_source #获取网站源码
data=str(pq(html)) #str() 函数将对象转化为适于人阅读的形式。
dic={}
re_rule=r'(.*?)'
datalist=re.findall(re_rule,data,re.S)
for i in range(0,len(datalist)):
rule1=r'/img/icon-lihao.png(.*?)'
bullish = re.findall(rule1,datalist[i],re.S)
if len(bullish)==0:
rule1=r'/img/icon-likong.png(.*?)'
bullish = re.findall(rule1,datalist[i],re.S)
rule2=r'(.*?)'
stock_name=re.findall(rule2,datalist[i], re.S)
if len(stock_name) > 0 and len( bullish) > 0:
for c in range(0,len(stock_name)):
dic[stock_name[c]]= bullish[0]
print("正在爬取第",len(dic)+1,"个请稍等.....")
c=len(datalist)
if len(dic) < num:
while(1):
browser.find_element_by_class_name("home-news-footer").click()
time.sleep(1)
html=browser.page_source
data=str(pq(html))
datalist=re.findall(re_rule,data,re.S)
for i in range(c,len(datalist)):
rule3=r'/img/icon-lihao.png(.*?)'
bullish = re.findall(rule3,datalist[i],re.S)
if len(bullish)==0:
rule5=r'/img/icon-likong.png(.*?)'
bullish = re.findall(rule5,datalist[i],re.S)
rule4=r'(.*?)'
stock_name=re.findall(rule4,datalist[i], re.S)
if len(stock_name) > 0 and len( bullish) > 0:
for c in range(0,len(stock_name)):
dic[stock_name[c]]= bullish[0]
c=len(datalist)
if len(dic) > num :
browser.quit()
print("爬取完毕!!")
break
print("正在爬取第",len(dic)+1,"个请稍等.....")
else:
browser.quit()
print("爬取完毕!!")
return dic
url='https://www.xuangubao.cn/'
dict=openurl(url,3)
print(dict)
#f=open("F:\\text.txt","a")
#for key,values in dict.items():
#f.write((key+"\t"))
#print(key,values)
#f.close()
---------------------
原来的: 查看全部
浏览器抓取网页(PYTHON的安装(已安装,可跳过此步骤))
(一)PYTHON安装(已经安装,可以跳过此步)
1、PYTHON下载
PYTHON官网:
根据对应系统下载,这里是window系统,点击windows,根据自己系统的操作位数下载
添加环境变量:
如果没有添加,可以自己在电脑上添加
(二)安装第三方库
安装selenium和pyquery,cmd命令下输入pip install selenium(pyquery安装类似)
如果报错,进入python目录下的scripts目录,然后输入命令
如果python的IDLE下没有报错,说明安装成功
(三)浏览器及对应浏览器驱动的安装
这里主要使用chrome浏览器,去谷歌官网下载安装,安装后查看谷歌版本,点击关于谷歌浏览器
(通常在这里找到)
我的版本:67.0
下载对应的webdriver(这里没有人推测每3个版本对应一个v65-67---v2.38,即v68-70--v2.39)
下载链接:
将下载好的chromedriver.exe解压,放到python36目录下(或者python36目录下的脚本)
IDLE下执行以下代码,会自动打开你的谷歌浏览器(环境搭建)
(四)详细示例代码
需求:爬取股票网站信息((“好”或“坏”)和“相关股票”),点击加载更多
(1)打开浏览器获取相关信息:
(2)网页分析(selenium有很多定位方式,这里用的比较少)
上述代码中,data已经拥有了网页当前页面的所有内容(可以输出观察);我们现在只需要从中获取我们想要的数据
在网页中,右键,检查元素,(或检查)分析网页:(由于获取的数据可能与网页分析的数据不同,建议输出数据并分析正则表达式从数据)
我们使用正则表达式查找所有以 1 开头并以 2 结尾的内容并使用 findall 函数
实现点击:(点击后“好股”和“相关股”的规律会与首页不同(后期点击与第一次点击相同))
定位方法如下:(用的比较少,这里就不详细介绍了,大家自己理解):
当您知道元素的 id 属性时使用 find_element_by_id 。使用此策略,将返回 id 属性值与位置匹配的第一个元素。
当您知道元素的名称属性时使用 find_element_by_name。使用此策略,将返回 id 属性值与位置匹配的第一个元素。
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
附上源代码:
#coding=utf-8
from selenium import webdriver
import time
import re
from pyquery import PyQuery as pq
def openurl(url,num):
browser = webdriver.Chrome() #打开浏览器
browser.get(url) #进入相关网站
html=browser.page_source #获取网站源码
data=str(pq(html)) #str() 函数将对象转化为适于人阅读的形式。
dic={}
re_rule=r'(.*?)'
datalist=re.findall(re_rule,data,re.S)
for i in range(0,len(datalist)):
rule1=r'/img/icon-lihao.png(.*?)'
bullish = re.findall(rule1,datalist[i],re.S)
if len(bullish)==0:
rule1=r'/img/icon-likong.png(.*?)'
bullish = re.findall(rule1,datalist[i],re.S)
rule2=r'(.*?)'
stock_name=re.findall(rule2,datalist[i], re.S)
if len(stock_name) > 0 and len( bullish) > 0:
for c in range(0,len(stock_name)):
dic[stock_name[c]]= bullish[0]
print("正在爬取第",len(dic)+1,"个请稍等.....")
c=len(datalist)
if len(dic) < num:
while(1):
browser.find_element_by_class_name("home-news-footer").click()
time.sleep(1)
html=browser.page_source
data=str(pq(html))
datalist=re.findall(re_rule,data,re.S)
for i in range(c,len(datalist)):
rule3=r'/img/icon-lihao.png(.*?)'
bullish = re.findall(rule3,datalist[i],re.S)
if len(bullish)==0:
rule5=r'/img/icon-likong.png(.*?)'
bullish = re.findall(rule5,datalist[i],re.S)
rule4=r'(.*?)'
stock_name=re.findall(rule4,datalist[i], re.S)
if len(stock_name) > 0 and len( bullish) > 0:
for c in range(0,len(stock_name)):
dic[stock_name[c]]= bullish[0]
c=len(datalist)
if len(dic) > num :
browser.quit()
print("爬取完毕!!")
break
print("正在爬取第",len(dic)+1,"个请稍等.....")
else:
browser.quit()
print("爬取完毕!!")
return dic
url='https://www.xuangubao.cn/'
dict=openurl(url,3)
print(dict)
#f=open("F:\\text.txt","a")
#for key,values in dict.items():
#f.write((key+"\t"))
#print(key,values)
#f.close()
---------------------
原来的:
浏览器抓取网页(Python中urllib库Python2系列使用的步骤和访问步骤 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2022-01-09 15:03
)
一:爬取一个简单的页面:
用Python做爬虫网站这个功能很强大。今天尝试抓取百度主页,非常成功。让我们看一下步骤。
首先你需要准备工具:
1.python:我比较喜欢用新东西,所以用Python3.6、python下载地址:
2.开发工具:可以使用Python编译器(小),但是因为之前一直在做前端,使用webstrom,所以选择JetBrains的PyCharm,下载地址:%E4%B8%8B%E8 %BD%BD
3.Fiddler——一个网页请求监控工具,我们可以用它来了解用户触发网页请求后发生的详细步骤;(从百度下载)
理解 Python 中的 urllib 库
Python2系列使用urllib2,在Python3之后会集成到urllib中。
在 2:
urllib2.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urllib2.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
3 是
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
#这个函数看起来接受很多的参数啊,不过很多我们平时不会用到,用到的url居多。
显然,我使用后者
简单的爬虫代码
#encoding:UTF-8
import urllib.request
url = "https://www.douban.com/ "
data = urllib.request.urlopen(url).read()
data = data.decode('UTF-8')
print(data)
效果如下:
二:抓取需要伪装浏览器的网站
但是一个小小的百度主页怎么能满足我,于是想到了一些需要伪装浏览器去抓取的网站,比如豆瓣,
1.假浏览器:
对于一些需要登录的网站,如果请求不是来自浏览器,则不会收到响应。因此,我们需要将爬虫发出的请求伪装成浏览器的正规军。
具体实现:自定义网页请求头。
2.,使用Fiddler查看请求和响应头
打开工具Fiddler,然后在浏览器中访问“”。在Fiddler左侧的访问记录中,找到“200 HTTPS”条目,点击查看对应的请求头和响应头的具体内容:
3.访问:
import urllib.request
import ssl
ssl._create_default_https_context = ssl._create_stdlib_context
# 定义保存函数
def saveFile(data):
path = "F:\\pachong\\02_douban.out"
f = open(path, 'wb')
f.write(data)
f.close()
# 网址
url = "https://www.douban.com/"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/51.0.2704.63 Safari/537.36'}
req = urllib.request.Request(url=url, headers=headers)
res = urllib.request.urlopen(req)
data = res.read()
# 也可以把爬取的内容保存到文件中
saveFile(data)
data = data.decode('utf-8')
# 打印抓取的内容
print(data)
# 打印爬取网页的各类信息
print(type(res))
print(res.geturl())
print(res.info())
print(res.getcode())
让我们看一下这段代码:
import ssl
ssl._create_default_https_context = ssl._create_stdlib_context 查看全部
浏览器抓取网页(Python中urllib库Python2系列使用的步骤和访问步骤
)
一:爬取一个简单的页面:
用Python做爬虫网站这个功能很强大。今天尝试抓取百度主页,非常成功。让我们看一下步骤。
首先你需要准备工具:
1.python:我比较喜欢用新东西,所以用Python3.6、python下载地址:
2.开发工具:可以使用Python编译器(小),但是因为之前一直在做前端,使用webstrom,所以选择JetBrains的PyCharm,下载地址:%E4%B8%8B%E8 %BD%BD
3.Fiddler——一个网页请求监控工具,我们可以用它来了解用户触发网页请求后发生的详细步骤;(从百度下载)
理解 Python 中的 urllib 库
Python2系列使用urllib2,在Python3之后会集成到urllib中。
在 2:
urllib2.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urllib2.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
3 是
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
#这个函数看起来接受很多的参数啊,不过很多我们平时不会用到,用到的url居多。
显然,我使用后者
简单的爬虫代码
#encoding:UTF-8
import urllib.request
url = "https://www.douban.com/ "
data = urllib.request.urlopen(url).read()
data = data.decode('UTF-8')
print(data)
效果如下:

二:抓取需要伪装浏览器的网站
但是一个小小的百度主页怎么能满足我,于是想到了一些需要伪装浏览器去抓取的网站,比如豆瓣,
1.假浏览器:
对于一些需要登录的网站,如果请求不是来自浏览器,则不会收到响应。因此,我们需要将爬虫发出的请求伪装成浏览器的正规军。
具体实现:自定义网页请求头。
2.,使用Fiddler查看请求和响应头
打开工具Fiddler,然后在浏览器中访问“”。在Fiddler左侧的访问记录中,找到“200 HTTPS”条目,点击查看对应的请求头和响应头的具体内容:

3.访问:
import urllib.request
import ssl
ssl._create_default_https_context = ssl._create_stdlib_context
# 定义保存函数
def saveFile(data):
path = "F:\\pachong\\02_douban.out"
f = open(path, 'wb')
f.write(data)
f.close()
# 网址
url = "https://www.douban.com/"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/51.0.2704.63 Safari/537.36'}
req = urllib.request.Request(url=url, headers=headers)
res = urllib.request.urlopen(req)
data = res.read()
# 也可以把爬取的内容保存到文件中
saveFile(data)
data = data.decode('utf-8')
# 打印抓取的内容
print(data)
# 打印爬取网页的各类信息
print(type(res))
print(res.geturl())
print(res.info())
print(res.getcode())
让我们看一下这段代码:
import ssl
ssl._create_default_https_context = ssl._create_stdlib_context
浏览器抓取网页(网页浏览器主要通过HTTP协议连接网页伺服器而取得(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2022-01-08 08:06
Web浏览器主要通过HTTP协议连接Web服务器获取网页。HTTP 允许网络浏览器向网络服务器发送数据并获取网页。目前最常用的HTTP是HTTP/1.1,在RFC2616中有完整的定义。HTTP/1.1 有自己的一套标准,Internet Explorer 不完全支持,但是许多其他当代 Web 浏览器完全支持这些标准。
网页的位置由 URL(Uniform Resource Locator)表示,即网页的地址;以http:开头的一种是通过HTTP协议登录。许多浏览器还支持其他类型的 URL 和协议,例如 ftp:用于 FTP(文件传输协议)、gopher:用于 Gopher 和 https:用于 HTTPS(SSL 加密的 HTTP)。
网页通常使用超文本标记语言(标准通用标记语言下的应用程序)文件格式,并在 HTTP 协议中定义为 MIME 内容。大多数浏览器支持 HTML 以外的许多文件格式,例如 JPEG、PNG 和 GIF 图像格式,并且可以使用插件支持其他文件类型。通过结合 HTTP 内容类型和 URL 协议,网页设计者可以在网页中收录图像、动画、视频、声音和流媒体,或者允许人们通过网页访问它们。
早期的网络浏览器只支持 HTML 的简化版本。专有软件浏览器的快速发展导致了非标准 HTML 代码的产生。这会导致浏览器兼容性问题。现代浏览器(Mozilla、Opera 和 Safari)支持标准 HTML 和 XHTML(从 HTML 4.01 开始)。它们都显示相同的页面效果。Internet Explorer 仍然不完全支持 HTML 4.01 和 XHTML 1.x。现在很多网站都是使用WYSIWYG HTML编辑软件构建的,包括Macromedia Dreamweaver和Microsoft Frontpage。他们通常默认生成非标准的 HTML;这阻止了 W3C 开发统一标准,尤其是 XHTML 和 CSS(级联样式表,在设计网页时使用)。
一些浏览器还为 Usenet 新闻组、IRC(Internet 中继聊天)和电子邮件加载了附加组件。支持的协议包括 NNTP(网络新闻传输协议)、SMTP(简单邮件传输协议)、IMAP(交互式邮件访问协议)和 POP(邮局协议)。 查看全部
浏览器抓取网页(网页浏览器主要通过HTTP协议连接网页伺服器而取得(图))
Web浏览器主要通过HTTP协议连接Web服务器获取网页。HTTP 允许网络浏览器向网络服务器发送数据并获取网页。目前最常用的HTTP是HTTP/1.1,在RFC2616中有完整的定义。HTTP/1.1 有自己的一套标准,Internet Explorer 不完全支持,但是许多其他当代 Web 浏览器完全支持这些标准。
网页的位置由 URL(Uniform Resource Locator)表示,即网页的地址;以http:开头的一种是通过HTTP协议登录。许多浏览器还支持其他类型的 URL 和协议,例如 ftp:用于 FTP(文件传输协议)、gopher:用于 Gopher 和 https:用于 HTTPS(SSL 加密的 HTTP)。
网页通常使用超文本标记语言(标准通用标记语言下的应用程序)文件格式,并在 HTTP 协议中定义为 MIME 内容。大多数浏览器支持 HTML 以外的许多文件格式,例如 JPEG、PNG 和 GIF 图像格式,并且可以使用插件支持其他文件类型。通过结合 HTTP 内容类型和 URL 协议,网页设计者可以在网页中收录图像、动画、视频、声音和流媒体,或者允许人们通过网页访问它们。
早期的网络浏览器只支持 HTML 的简化版本。专有软件浏览器的快速发展导致了非标准 HTML 代码的产生。这会导致浏览器兼容性问题。现代浏览器(Mozilla、Opera 和 Safari)支持标准 HTML 和 XHTML(从 HTML 4.01 开始)。它们都显示相同的页面效果。Internet Explorer 仍然不完全支持 HTML 4.01 和 XHTML 1.x。现在很多网站都是使用WYSIWYG HTML编辑软件构建的,包括Macromedia Dreamweaver和Microsoft Frontpage。他们通常默认生成非标准的 HTML;这阻止了 W3C 开发统一标准,尤其是 XHTML 和 CSS(级联样式表,在设计网页时使用)。
一些浏览器还为 Usenet 新闻组、IRC(Internet 中继聊天)和电子邮件加载了附加组件。支持的协议包括 NNTP(网络新闻传输协议)、SMTP(简单邮件传输协议)、IMAP(交互式邮件访问协议)和 POP(邮局协议)。
浏览器抓取网页( 第11行GetHTMLDocumentFormHwnd获取浏览器页面内容的资料及详细内容)
网站优化 • 优采云 发表了文章 • 0 个评论 • 42 次浏览 • 2022-01-08 08:04
第11行GetHTMLDocumentFormHwnd获取浏览器页面内容的资料及详细内容)
private void timer1_Tick(object sender, EventArgs e)
{
lock (currentLock)
{
System.Drawing.Point MousePoint = System.Windows.Forms.Form.MousePosition;
if (_leftClick)
{
timer1.Stop();
_leftClick = false;
_lastDocument = GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false));
if (_lastDocument != null)
{
if (_getDocument)
{
_getDocument = true;
try
{
string url = _lastDocument.url;
string html = _lastDocument.documentElement.outerHTML;
string cookie = _lastDocument.cookie;
string domain = _lastDocument.domain;
var resolveParams = new ResolveParam
{
Url = new Uri(url),
Html = html,
PageCookie = cookie,
Domain = domain
};
RequetResove(resolveParams);
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
}
}
else
{
new MessageTip().Show("xx", "当前页面不是IE浏览器页面,或使用了非IE内核浏览器,如火狐,搜狗等。请使用IE浏览器打开网页");
}
_getDocument = false;
}
else
{
_pointFrm.Left = MousePoint.X + 10;
_pointFrm.Top = MousePoint.Y + 10;
}
}
}
第11行的GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false))分解,首先从鼠标坐标中获取页面的句柄:
public static IntPtr GetPointControl(System.Drawing.Point p, bool allControl)
{
IntPtr handle = Win32APIsFull.WindowFromPoint(p);
if (handle != IntPtr.Zero)
{
System.Drawing.Rectangle rect = default(System.Drawing.Rectangle);
if (Win32APIsFull.GetWindowRect(handle, out rect))
{
return Win32APIsFull.ChildWindowFromPointEx(handle, new System.Drawing.Point(p.X - rect.X, p.Y - rect.Y), allControl ? Win32APIsFull.CWP.ALL : Win32APIsFull.CWP.SKIPINVISIBLE);
}
}
return IntPtr.Zero;
}
接下来,根据句柄获取页面内容:
public static HTMLDocument GetHTMLDocumentFormHwnd(IntPtr hwnd)
{
IntPtr result = Marshal.AllocHGlobal(4);
Object obj = null;
Console.WriteLine(Win32APIsFull.SendMessageTimeoutA(hwnd, HTML_GETOBJECT_mid, 0, 0, 2, 1000, result));
if (Marshal.ReadInt32(result) != 0)
{
Console.WriteLine(Win32APIsFull.ObjectFromLresult(Marshal.ReadInt32(result), ref IID_IHTMLDocument, 0, out obj));
}
Marshal.FreeHGlobal(result);
return obj as HTMLDocument;
}
一般原则:
向IE窗体发送消息,获取指向IE浏览器的某个内存块(非托管)的指针,然后根据这个指针获取HTMLDocument对象。
该方法涉及win32的两个功能:
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "SendMessageTimeoutA")]
public static extern int SendMessageTimeoutA(
[InAttribute()] System.IntPtr hWnd,
uint Msg, uint wParam, int lParam,
uint fuFlags,
uint uTimeout,
System.IntPtr lpdwResult);
[System.Runtime.InteropServices.DllImportAttribute("oleacc.dll", EntryPoint = "ObjectFromLresult")]
public static extern int ObjectFromLresult(
int lResult,
ref Guid riid,
int wParam,
[MarshalAs(UnmanagedType.IDispatch), Out]
out Object pObject
);
以上就是c#从IE浏览器获取当前页面内容的详细内容。更多关于c#获取浏览器页面内容的内容,请关注云海天教程中其他相关话题文章! 查看全部
浏览器抓取网页(
第11行GetHTMLDocumentFormHwnd获取浏览器页面内容的资料及详细内容)
private void timer1_Tick(object sender, EventArgs e)
{
lock (currentLock)
{
System.Drawing.Point MousePoint = System.Windows.Forms.Form.MousePosition;
if (_leftClick)
{
timer1.Stop();
_leftClick = false;
_lastDocument = GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false));
if (_lastDocument != null)
{
if (_getDocument)
{
_getDocument = true;
try
{
string url = _lastDocument.url;
string html = _lastDocument.documentElement.outerHTML;
string cookie = _lastDocument.cookie;
string domain = _lastDocument.domain;
var resolveParams = new ResolveParam
{
Url = new Uri(url),
Html = html,
PageCookie = cookie,
Domain = domain
};
RequetResove(resolveParams);
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
}
}
else
{
new MessageTip().Show("xx", "当前页面不是IE浏览器页面,或使用了非IE内核浏览器,如火狐,搜狗等。请使用IE浏览器打开网页");
}
_getDocument = false;
}
else
{
_pointFrm.Left = MousePoint.X + 10;
_pointFrm.Top = MousePoint.Y + 10;
}
}
}
第11行的GetHTMLDocumentFormHwnd(GetPointControl(MousePoint, false))分解,首先从鼠标坐标中获取页面的句柄:
public static IntPtr GetPointControl(System.Drawing.Point p, bool allControl)
{
IntPtr handle = Win32APIsFull.WindowFromPoint(p);
if (handle != IntPtr.Zero)
{
System.Drawing.Rectangle rect = default(System.Drawing.Rectangle);
if (Win32APIsFull.GetWindowRect(handle, out rect))
{
return Win32APIsFull.ChildWindowFromPointEx(handle, new System.Drawing.Point(p.X - rect.X, p.Y - rect.Y), allControl ? Win32APIsFull.CWP.ALL : Win32APIsFull.CWP.SKIPINVISIBLE);
}
}
return IntPtr.Zero;
}
接下来,根据句柄获取页面内容:
public static HTMLDocument GetHTMLDocumentFormHwnd(IntPtr hwnd)
{
IntPtr result = Marshal.AllocHGlobal(4);
Object obj = null;
Console.WriteLine(Win32APIsFull.SendMessageTimeoutA(hwnd, HTML_GETOBJECT_mid, 0, 0, 2, 1000, result));
if (Marshal.ReadInt32(result) != 0)
{
Console.WriteLine(Win32APIsFull.ObjectFromLresult(Marshal.ReadInt32(result), ref IID_IHTMLDocument, 0, out obj));
}
Marshal.FreeHGlobal(result);
return obj as HTMLDocument;
}
一般原则:

向IE窗体发送消息,获取指向IE浏览器的某个内存块(非托管)的指针,然后根据这个指针获取HTMLDocument对象。
该方法涉及win32的两个功能:
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "SendMessageTimeoutA")]
public static extern int SendMessageTimeoutA(
[InAttribute()] System.IntPtr hWnd,
uint Msg, uint wParam, int lParam,
uint fuFlags,
uint uTimeout,
System.IntPtr lpdwResult);
[System.Runtime.InteropServices.DllImportAttribute("oleacc.dll", EntryPoint = "ObjectFromLresult")]
public static extern int ObjectFromLresult(
int lResult,
ref Guid riid,
int wParam,
[MarshalAs(UnmanagedType.IDispatch), Out]
out Object pObject
);
以上就是c#从IE浏览器获取当前页面内容的详细内容。更多关于c#获取浏览器页面内容的内容,请关注云海天教程中其他相关话题文章!
浏览器抓取网页(UserUA字串的含义及含义有哪些?Agent含义)
网站优化 • 优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2021-12-30 12:05
一、用户代理的含义
User Agent的中文名称是User Agent,简称UA。它是一个特殊的字符串头,使服务器能够识别操作系统和版本、CPU 类型、客户端使用的浏览器和版本、浏览器渲染引擎、浏览器语言和浏览器插件等。
有的网站往往通过对UA的判断,将不同的页面发送到不同的操作系统、不同的浏览器,所以有些页面在某个浏览器中可能无法正常显示,但可以通过伪装UA来绕过检测。
浏览器的UA字符串
标准格式为:浏览器标识(操作系统标识;加密级别标识;浏览器语言)渲染引擎标识版本信息
浏览器 ID
由于很多网站在进行UA检测时忽略了两位数的版本号,可能会导致浏览器及更高版本收到不良页面。因此,浏览器10以后版本中的浏览器标识项固定为浏览器。将实际版本信息添加到 UA 字符串的末尾。
注:来自百度百科
当浏览器发起请求时,我们可以查看请求信息。
请求头:请求头将收录
请求信息。
2:在浏览器请求头中获取User-Agent
(1) 请求
String userAgent = request.getHeader("user-agent");
(2)获取
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
三、UserAgentUtils.jar
UserAgentUtils.jar 是 UserAgent 的工具类。
(1)maven
eu.bitwalker
UserAgentUtils
1.20
(2)java 代码
UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
Browser browser = userAgent.getBrowser();
OperatingSystem os = userAgent.getOperatingSystem();
参考文章: 查看全部
浏览器抓取网页(UserUA字串的含义及含义有哪些?Agent含义)
一、用户代理的含义
User Agent的中文名称是User Agent,简称UA。它是一个特殊的字符串头,使服务器能够识别操作系统和版本、CPU 类型、客户端使用的浏览器和版本、浏览器渲染引擎、浏览器语言和浏览器插件等。
有的网站往往通过对UA的判断,将不同的页面发送到不同的操作系统、不同的浏览器,所以有些页面在某个浏览器中可能无法正常显示,但可以通过伪装UA来绕过检测。
浏览器的UA字符串
标准格式为:浏览器标识(操作系统标识;加密级别标识;浏览器语言)渲染引擎标识版本信息
浏览器 ID
由于很多网站在进行UA检测时忽略了两位数的版本号,可能会导致浏览器及更高版本收到不良页面。因此,浏览器10以后版本中的浏览器标识项固定为浏览器。将实际版本信息添加到 UA 字符串的末尾。
注:来自百度百科
当浏览器发起请求时,我们可以查看请求信息。

请求头:请求头将收录
请求信息。
2:在浏览器请求头中获取User-Agent
(1) 请求
String userAgent = request.getHeader("user-agent");
(2)获取
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
三、UserAgentUtils.jar
UserAgentUtils.jar 是 UserAgent 的工具类。
(1)maven
eu.bitwalker
UserAgentUtils
1.20
(2)java 代码
UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
Browser browser = userAgent.getBrowser();
OperatingSystem os = userAgent.getOperatingSystem();
参考文章:
浏览器抓取网页(如何快速收录网站不收录怎么办?(图))
网站优化 • 优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-12-29 17:16
经常有同学说怎么快速收录,网站不收录怎么办?
实际上,未收录
的站点通常是新站点。对于没有SEO基础,对SEO没有深入了解的小伙伴,经常会遇到问题。很多人甚至会告诉你,如果不收录,就会吸引网站流量,吸引蜘蛛来爬你。页。这些想法和操作都太片面了。
网站不包括:首先确定是刚上线1-3个月的新网站,还是半年多的老网站
如果是新网站:
主页在上线后1周内需要10-20天的时间采集
,大量的内部记录被采集
、搜索和发布。如果网站有很多空白页面,大量页面的内容是非常少的。在这种情况下,相应的页面不包括在内,否则索引会很慢。如果该网站超过20天未出现在首页,则该网站的域名可能会被搜索引擎屏蔽。您可以提交投诉以搜索 #1
老网站不收录,新增的页面大多没有内页搜索,多为页面质量问题。
本站不收录
常规分析思路
1、网站服务器必须稳定。在百度资源网站的管理信息中,抓取异常,可以看出服务器的稳定性。
2、检查robots.txt文件是否允许爬取。例如,网站首页和各版块页面是否被拦截抓取。
3、检查网站每个页面的路径是否良好。比如检查太多不利于集合调用的次数,以及site: website检查是否有动态和静态共存的路径
4、 重要页面不能用JS标签写。如:首页导航、版块样式、各版块页面块模型、内部页面版块不能写在JS标签中,看不懂代码的用户可以使用谷歌浏览器设置为不允许javascript抓取,然后刷新后看页面。效果,JS部分无法显示,显示效果
5、页面稳定,质量好。网站页面版块链接合理,内容质量好,页面无频繁变化,采集
来源不多,无用户搜索需求。
如果以上都没有问题,分析一下人为的变化因素
分析近三个月人为操作变化,内页内容未大量采集。例如,大量页面被删除,页面标题被修改,程序和网站模块频繁更改,甚至网站被搜索引擎降级,导致许多内部页面没有被收录。对内容的大量改动以及在内容中放置大量的广告链接弹窗都会导致新页面不被收录。
如何加快网站收录?
1、 主动推送链接:更新站点地图,提交给搜索引擎,在百度资源验证网站安装自动推送代码,添加页面抓取。
2、 做好网站内容丰富度优化:关注长尾关键词排名布局,做更多用户会搜索的内容,文章和正文,内容不少于500字,图片3张左右,图片和 可以给用户思考,图片要加上ATL关键词,让搜索引擎知道图片的意思,内容要收录
关键词主题用户将搜索。
3、引导百度蜘蛛抓取:到百度蜘蛛活跃度高的网站和论坛,获取一些导航网站链接,换取几个优质好友链接,加速网站抓取和收录。
4、关注搜索反馈:如果长时间没有收录,可以向搜索引擎投诉反馈。如本文图1所示
5、开熊掌:熊掌对优质内容有原创保护,优质原创内容将在优质原创内容的采集
和展示方面给予优惠
6、链接传播与分享:从营销角度提升品牌搜索量。培养用户忠诚度,增加网站用户采集
,分享文章链接,频繁互动回访。这些操作将有助于提高搜索抓取的频率、推动页面更新并提高整体网站的包容性。 查看全部
浏览器抓取网页(如何快速收录网站不收录怎么办?(图))
经常有同学说怎么快速收录,网站不收录怎么办?
实际上,未收录
的站点通常是新站点。对于没有SEO基础,对SEO没有深入了解的小伙伴,经常会遇到问题。很多人甚至会告诉你,如果不收录,就会吸引网站流量,吸引蜘蛛来爬你。页。这些想法和操作都太片面了。
网站不包括:首先确定是刚上线1-3个月的新网站,还是半年多的老网站
如果是新网站:
主页在上线后1周内需要10-20天的时间采集
,大量的内部记录被采集
、搜索和发布。如果网站有很多空白页面,大量页面的内容是非常少的。在这种情况下,相应的页面不包括在内,否则索引会很慢。如果该网站超过20天未出现在首页,则该网站的域名可能会被搜索引擎屏蔽。您可以提交投诉以搜索 #1
老网站不收录,新增的页面大多没有内页搜索,多为页面质量问题。
本站不收录
常规分析思路
1、网站服务器必须稳定。在百度资源网站的管理信息中,抓取异常,可以看出服务器的稳定性。
2、检查robots.txt文件是否允许爬取。例如,网站首页和各版块页面是否被拦截抓取。
3、检查网站每个页面的路径是否良好。比如检查太多不利于集合调用的次数,以及site: website检查是否有动态和静态共存的路径
4、 重要页面不能用JS标签写。如:首页导航、版块样式、各版块页面块模型、内部页面版块不能写在JS标签中,看不懂代码的用户可以使用谷歌浏览器设置为不允许javascript抓取,然后刷新后看页面。效果,JS部分无法显示,显示效果
5、页面稳定,质量好。网站页面版块链接合理,内容质量好,页面无频繁变化,采集
来源不多,无用户搜索需求。
如果以上都没有问题,分析一下人为的变化因素
分析近三个月人为操作变化,内页内容未大量采集。例如,大量页面被删除,页面标题被修改,程序和网站模块频繁更改,甚至网站被搜索引擎降级,导致许多内部页面没有被收录。对内容的大量改动以及在内容中放置大量的广告链接弹窗都会导致新页面不被收录。
如何加快网站收录?
1、 主动推送链接:更新站点地图,提交给搜索引擎,在百度资源验证网站安装自动推送代码,添加页面抓取。
2、 做好网站内容丰富度优化:关注长尾关键词排名布局,做更多用户会搜索的内容,文章和正文,内容不少于500字,图片3张左右,图片和 可以给用户思考,图片要加上ATL关键词,让搜索引擎知道图片的意思,内容要收录
关键词主题用户将搜索。
3、引导百度蜘蛛抓取:到百度蜘蛛活跃度高的网站和论坛,获取一些导航网站链接,换取几个优质好友链接,加速网站抓取和收录。
4、关注搜索反馈:如果长时间没有收录,可以向搜索引擎投诉反馈。如本文图1所示
5、开熊掌:熊掌对优质内容有原创保护,优质原创内容将在优质原创内容的采集
和展示方面给予优惠
6、链接传播与分享:从营销角度提升品牌搜索量。培养用户忠诚度,增加网站用户采集
,分享文章链接,频繁互动回访。这些操作将有助于提高搜索抓取的频率、推动页面更新并提高整体网站的包容性。
浏览器抓取网页(学习Python包并实现基本的爬虫过程Python中爬虫相关的包)
网站优化 • 优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-12-29 17:09
随着互联网数据的爆发式增长,我们可以通过使用Python爬虫获取大量有价值的数据:
1. 爬取数据,进行市场调研和商业分析
抓取知乎优质答案,筛选每个话题下的最佳内容;抓取房地产网站买卖信息,分析房价走势,做不同区域的房价分析;抓取招聘网站的职位信息,分析各行业层次的人才需求和薪酬。
2.作为机器学习和数据挖掘的原创
数据
比如你想做一个推荐系统,那么你可以爬取更多维度的数据,做一个更好的模型。
3. 爬取优质资源:图片、文字、视频
爬取商品评论和各种图片网站,获取图片资源和评论文字数据。
掌握正确的方法,能够在短时间内抓取主流网站的数据,其实很容易。
首先我们来了解一下爬虫的基本原理和流程
大多数爬虫都遵循“发送请求-获取页面-解析页面-提取并存储内容”的过程,实际上模拟了使用浏览器获取网页信息的过程。
简单的说,我们向服务器发送请求后,会得到返回的页面。解析完页面后,我们就可以提取出我们想要的那部分信息,存放在指定的文档或数据库中。
在这部分,您可以对HTTP协议和网页的基础知识,如POSTGET、HTML、CSS、JS等有一个简单的了解,简单的了解一下,无需系统学习。
学习Python包,实现基本爬取过程
Python中有很多爬虫相关的包:urllib、requests、bs4、scrapy、pyspider等,建议从requests+Xpath入手。Requests 负责连接到网站并返回到网页。Xpath用于解析网页,方便数据提取。
如果你用过BeautifulSoup,你会发现Xpath省了很多麻烦,层层检查元素代码的工作全部省略了。掌握了之后,你会发现爬虫的基本套路都差不多。一般的静态网站都不是问题。小猪,豆瓣,尴尬百科,腾讯新闻等基本都可以用。
保存数据
首先,我们说到存储数据,是因为在最初的学习中,接触很少,没有必要过多关注。随着学习的逐渐深入,当我们需要保存大量数据的时候,就需要学习数据库了。相关知识!
初期,我们抓到需要的内容后,只需要保存到本地即可。无非是文件、表格(excel)等几种方法。这里只需要掌握with语句就可以基本保证需求。它看起来像这样:
with open (path and file name, save mode) as f:
f.write(数据)#如果是文本,可以直接写入,如果是其他文件,数据最好用二进制方式
当然需要使用xlwt库(excel)和python-docx库(word)保存到excel表格或者word文档中。这个网上很多,可以自己学。
获取数据
说了这么多,我们来谈谈正题。如何抓取我们想要的数据?我们一步一步来!
一般所谓的抓取网页内容是指通过Python脚本访问某个URL地址(请求数据),然后获取返回的内容(HTML源代码、Json格式字符串等)。然后通过解析规则(页面解析),对我们需要的数据进行分析和获取(内容匹配)。
在python中实现爬虫非常方便。有大量的库可以满足我们的需求。比如首先使用requests库获取一个url(网页)的源码
导入请求#导入库
url ='您的目标网址'
response = requests.get(url) #请求数据
print(response.text) #打印出数据的文本内容
这几行代码就可以拿到网页的源码了,但是有时候会出现乱码,为什么呢?
由于中文网站收录
中文,终端不支持gbk编码,打印时需要将中文从gbk格式转换为终端支持的编码,一般为utf-8编码。
所以在我们打印响应之前,我们需要指定它的编码(我们可以直接将代码显示的编码格式指定为网页本身的编码格式,比如utf-8。网页的编码格式一般是源代码中标签下的字符集。在属性中指定)。只需添加一行。
response.encode ='utf-8' #指定编码格式
至此,我们已经获得了网页的源代码。下一步是在杂乱的源代码中找到我们需要的东西。这里需要用到各种匹配方法。常用的方法有:正则表达式(re库)、bs4(Beautifulsoup4库)、xpath(lxml库)!
建议大家从常规规则开始学习,最后一定要看看xpath,爬虫框架scrapy中用的很多!
通过各种匹配方式找到我们的内容后(注意:一般匹配是一个列表),我们就到了上面提到的存储数据的阶段,这样就完成了一个简单的爬虫!
当然,我们在写代码的时候,会发现很多上面没有提到的内容,比如
剩下的我们慢慢研究。
总结
Python爬虫技术不需要你系统地精通一门语言,也不需要任何高级的数据库技术。高效的姿势就是从实际项目中学习这些零散的知识点,可以保证每次学习到的都是最需要的部分。
当然,唯一的麻烦是在具体问题中,如何找到具体需要的那部分学习资源,如何筛选筛选,是很多初学者面临的一大难题。
分享IT技术和行业经验,请关注-技校。 查看全部
浏览器抓取网页(学习Python包并实现基本的爬虫过程Python中爬虫相关的包)
随着互联网数据的爆发式增长,我们可以通过使用Python爬虫获取大量有价值的数据:
1. 爬取数据,进行市场调研和商业分析
抓取知乎优质答案,筛选每个话题下的最佳内容;抓取房地产网站买卖信息,分析房价走势,做不同区域的房价分析;抓取招聘网站的职位信息,分析各行业层次的人才需求和薪酬。
2.作为机器学习和数据挖掘的原创
数据
比如你想做一个推荐系统,那么你可以爬取更多维度的数据,做一个更好的模型。
3. 爬取优质资源:图片、文字、视频
爬取商品评论和各种图片网站,获取图片资源和评论文字数据。
掌握正确的方法,能够在短时间内抓取主流网站的数据,其实很容易。
首先我们来了解一下爬虫的基本原理和流程
大多数爬虫都遵循“发送请求-获取页面-解析页面-提取并存储内容”的过程,实际上模拟了使用浏览器获取网页信息的过程。
简单的说,我们向服务器发送请求后,会得到返回的页面。解析完页面后,我们就可以提取出我们想要的那部分信息,存放在指定的文档或数据库中。
在这部分,您可以对HTTP协议和网页的基础知识,如POSTGET、HTML、CSS、JS等有一个简单的了解,简单的了解一下,无需系统学习。
学习Python包,实现基本爬取过程
Python中有很多爬虫相关的包:urllib、requests、bs4、scrapy、pyspider等,建议从requests+Xpath入手。Requests 负责连接到网站并返回到网页。Xpath用于解析网页,方便数据提取。
如果你用过BeautifulSoup,你会发现Xpath省了很多麻烦,层层检查元素代码的工作全部省略了。掌握了之后,你会发现爬虫的基本套路都差不多。一般的静态网站都不是问题。小猪,豆瓣,尴尬百科,腾讯新闻等基本都可以用。
保存数据
首先,我们说到存储数据,是因为在最初的学习中,接触很少,没有必要过多关注。随着学习的逐渐深入,当我们需要保存大量数据的时候,就需要学习数据库了。相关知识!
初期,我们抓到需要的内容后,只需要保存到本地即可。无非是文件、表格(excel)等几种方法。这里只需要掌握with语句就可以基本保证需求。它看起来像这样:
with open (path and file name, save mode) as f:
f.write(数据)#如果是文本,可以直接写入,如果是其他文件,数据最好用二进制方式
当然需要使用xlwt库(excel)和python-docx库(word)保存到excel表格或者word文档中。这个网上很多,可以自己学。
获取数据
说了这么多,我们来谈谈正题。如何抓取我们想要的数据?我们一步一步来!
一般所谓的抓取网页内容是指通过Python脚本访问某个URL地址(请求数据),然后获取返回的内容(HTML源代码、Json格式字符串等)。然后通过解析规则(页面解析),对我们需要的数据进行分析和获取(内容匹配)。
在python中实现爬虫非常方便。有大量的库可以满足我们的需求。比如首先使用requests库获取一个url(网页)的源码
导入请求#导入库
url ='您的目标网址'
response = requests.get(url) #请求数据
print(response.text) #打印出数据的文本内容
这几行代码就可以拿到网页的源码了,但是有时候会出现乱码,为什么呢?
由于中文网站收录
中文,终端不支持gbk编码,打印时需要将中文从gbk格式转换为终端支持的编码,一般为utf-8编码。
所以在我们打印响应之前,我们需要指定它的编码(我们可以直接将代码显示的编码格式指定为网页本身的编码格式,比如utf-8。网页的编码格式一般是源代码中标签下的字符集。在属性中指定)。只需添加一行。
response.encode ='utf-8' #指定编码格式
至此,我们已经获得了网页的源代码。下一步是在杂乱的源代码中找到我们需要的东西。这里需要用到各种匹配方法。常用的方法有:正则表达式(re库)、bs4(Beautifulsoup4库)、xpath(lxml库)!
建议大家从常规规则开始学习,最后一定要看看xpath,爬虫框架scrapy中用的很多!
通过各种匹配方式找到我们的内容后(注意:一般匹配是一个列表),我们就到了上面提到的存储数据的阶段,这样就完成了一个简单的爬虫!
当然,我们在写代码的时候,会发现很多上面没有提到的内容,比如
剩下的我们慢慢研究。
总结
Python爬虫技术不需要你系统地精通一门语言,也不需要任何高级的数据库技术。高效的姿势就是从实际项目中学习这些零散的知识点,可以保证每次学习到的都是最需要的部分。
当然,唯一的麻烦是在具体问题中,如何找到具体需要的那部分学习资源,如何筛选筛选,是很多初学者面临的一大难题。
分享IT技术和行业经验,请关注-技校。