如何抓取WEB页面

简介: 文章转载自: http://blog.binux.me/2013/09/howto-crawl-web/1. HTTP协议       WEB内容是通过HTTP协议传输的,实际上,任何的抓取行为都是在模拟浏览器的HTTP请求。

文章转载自: http://blog.binux.me/2013/09/howto-crawl-web/


1. HTTP协议
       WEB内容是通过HTTP协议传输的,实际上,任何的抓取行为都是在模拟浏览器的HTTP请求。那么,首先通过 http://zh.wikipedia.org/wiki/ 超文本传输协议 来对HTTP协议来进行初步的了解:


* HTTP通常通过创建到服务器80端口的TCP连接进行通信
* HTTP协议的内容包括请求方式(method), url,header,body,通常以纯文本方式发送
* HTTP返回内容包括状态码,header,body,通常以纯文本方式返回
* header以及body间以CRLF(\r\n)分割


       由于富web应用越来越盛行,单纯的HTTP协议已经不能满足 -人类的欲望- 人们的需求了,websocket, spdy等越来越多的非HTTP协议信息传输手段被使用,但是目前看来,web的主要信息依旧承载于http协议。
       

我们通过访问http://www.baidu.com/来查看一个正常的HTTP请求,浏览器的HTTP 请求部分如下所示:

GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.66 Safari/537.36
DNT: 1
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8

请求中的第一行称为Request-Line,包含了“请求方式 URL HTTP版本”,在上面的例子中,这个请求方式(method)为GET,URL为 /, HTTP版本为 HTTP/1.1 。
注意到这里的URL并不是我们访问时的 http://www.baidu.com/ 而只是一个 /,而www.baidu.com的域名在Header Host: www.baidu.com 中体现。这样表示请求的资源 / 是位于主机(host) www.baidu.com 上的,而 GET http://www.baidu.com/ HTTP/1.1 则表示请求的资源位于别的地方,通常用于http代理请求中。
请求的后续行都是Header,其中比较重要的header有 Host, User-Agent, Cookie, Referer, X-Requested-With (这个请求中未展现)。如果是POST请求,还会有body。
虽然并不需要理解HTTP请求,只要参照展示的内容模拟请求就可以抓取到内容,但是学习一下各个header的作用有助于理解哪些元素是必须的,哪些可以被忽略或修改。
更多内容可以通过以下链接进行进一步学习: 
http://zh.wikipedia.org/wiki/URL 
http://en.wikipedia.org/wiki/Query_string 
http://en.wikipedia.org/wiki/HTTP_POST 
http://en.wikipedia.org/wiki/List_of_HTTP_header_fields 

好了,这就是一个请求的全部,只要正确模拟了method,url,header,body 这四要素,任何内容都能抓下来,而所有的四个要素,只要打开浏览器-审查元素-Network就能看到!

2. curl

现在我们就可以通过curl命令来模拟一个请求: 
curl -v -H "User-Agent: Chrome" http://www.baidu.com/ 
其中 -v 用于显示了请求的内容,-H 指定header,具体curl的使用方式可以 man curl 或者你可以在chrome或者其他平台上找到很多类似的工具。 
如果想看到请求是否正确,可以 curl http://httpbin.org/get 这个地址,它会返回经过解析的请求内容,来看看你的请求是否符合预期(http://httpbin.org/中有包括POST在内的完整API)
HTTP返回下面展示了一个http返回的header部分,body内容被省略:
HTTP/1.1 200 OK
Date: Mon, 30 Sep 2013 06:51:11 GMT
Server: BWS/1.0
Content-Length: 4379
Content-Type: text/html;charset=utf-8

Cache-Control: private
BDPAGETYPE: 1
BDUSERID: 0
BDQID: 0x8e3bf8800bcc3d7e
Set-Cookie: BDSVRTM=2; path=/
Set-Cookie: H_PS_PSSID=3409_3381_1462_2980_3089_3502_3439; path=/; domain=.baidu.com
Set-Cookie: BAIDUID=5DDF70314DF9C307385D1821EC3B9F78:FG=1; expires=Mon, 30-Sep-43 06:51:11 GMT; path=/; domain=.baidu.com
Expires: Mon, 30 Sep 2013 06:51:11 GMT
Content-Encoding: gzip
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Connection: Keep-Alive

其中第一行为 HTTP版本 状态码 状态文字说明 之后的内容都是header,其中比较重要的有:Content-Type, Set-Cookie, Location, Content-Encoding(参见 HTTP_header#Requests)。返回之后的内容就是我们看到的网页内容了。
返回中最重要的是状态码和body中的内容,状态码决定抓取是否成功(200),是否会有跳转 (HTTP状态码),内容就是我们关心的内容了。


3. 实际应用
其他http库在实际抓取中,选择一个方便的HTTP库会帮你解决很多http的细节问题,比如http库会帮你:
* 建立http连接
* 设定常用header,生成正确的http请求
* get/post参数编码
* 跳转重定向
* 自动保存处理cookie
* 返回gzip解压,内容编码
python中推荐 requests,在命令行中我一般用curl进行调试。


AJAX:
现在越来越多的页面使用了AJAX技术,表现为内容并不在打开的页面的源码中,而是通过称为 AJAX 的技术,在页面打开后加载的。但实际上,AJAX也是通过HTTP传送信息的,只不过内容来自于页面发起的另一个http请求,通过查看chome中的network列出的页面所有请求,一定可以找到内容,之后只需要模拟对应的这个请求即可。

HTML内容解析:web页面大都以HTML编写,对于简单的内容提取,使用正则即可。但是对付复杂的内容提取需求正则并不是一个好的选择(甚至称不上一个正确的选择),一款HTML/XML解析器+xpath/css selector是一个更有效的选择。

富web应用:可能分析AJAX请求,和内容提取的代价太高。这时可能需要上最后手段——浏览器渲染。通过 phantomjs或类似浏览器引擎,构建一个真实的浏览器执行js、渲染页面。


目录
相关文章
|
1月前
|
编解码 前端开发 JavaScript
使用 CSS 打印样式为 Web 页面设置专业的打印机效果
使用 CSS 打印样式为 Web 页面设置专业的打印机效果
57 2
|
2月前
|
存储
在 Web 中判断页面是不是刷新
【9月更文挑战第10天】在Web开发中,判断页面是否刷新有多种方法:1) 监听`popstate`事件,检测用户是否通过历史记录访问页面;2) 记录并比较页面加载时间戳,若相差极小,则可能为刷新;3) 利用本地存储设置特定值,若该值不存在或不符合预期,则页面可能被刷新。然而,这些方法并非绝对准确。
176 3
|
3月前
|
开发框架 前端开发 Java
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
【8月更文挑战第12天】SpringBootWeb极速入门-实现一个简单的web页面01
72 3
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
html,web页面朗读文字,朗读中文,朗读英文
html,web页面朗读文字,朗读中文,朗读英文
|
3月前
|
数据处理 开发者 UED
FastAPI 的模板引擎简直太神奇啦!这就是构建动态 Web 页面的终极秘籍,快来一探究竟!
【8月更文挑战第31天】FastAPI 是一款高性能异步 Web 框架,可通过集成模板引擎(如 Jinja2 或 Mako)实现动态页面渲染。使用模板引擎可分离页面结构与数据,简化代码并提升可维护性。此外,它还提供丰富的语法支持,如循环和条件判断,从而增强页面展示效果及开发效率。通过简单的配置步骤,即可在 FastAPI 中启用模板引擎,显著改善用户体验。
332 1
|
3月前
|
数据采集 定位技术 API
为什么要选住宅IP代理抓取Web数据?
在数据采集和Web爬虫领域,选择合适的IP代理至关重要。住宅IP代理因高隐蔽性和真实性、更好的访问成功率、能绕过反爬虫策略、多样化的地理位置、适应性和灵活性以及合法合规等优势,成为许多数据抓取项目的首选。使用住宅IP代理可提高数据抓取效率,降低被封禁风险,同时需遵守法律法规,确保活动的合法性与合规性。
|
3月前
|
XML JavaScript 测试技术
Web自动化测试框架(基础篇)--HTML页面元素和DOM对象
本文为Web自动化测试入门指南,介绍了HTML页面元素和DOM对象的基础知识,以及如何使用Python中的Selenium WebDriver进行元素定位、操作和等待机制,旨在帮助初学者理解Web自动化测试中的关键概念和操作技巧。
54 1
|
2月前
|
数据处理 Python
Django视图:构建动态Web页面的核心技术
Django视图:构建动态Web页面的核心技术
|
3月前
|
存储 Linux 网络安全
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
|
3月前
|
监控 Java 应用服务中间件
【Azure 应用服务】App Service中抓取 Web Job 的 DUMP 办法
【Azure 应用服务】App Service中抓取 Web Job 的 DUMP 办法
下一篇
无影云桌面