Python抓取HTML

本文详细介绍了网页抓取的基本步骤,包括抓取HTML字符串的方法、GET与HEAD请求的区别及应用,以及POST请求的具体实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 抓取网页的三个步骤(个人表面的理解)


1. 抓取HTML字符串.

2. 分析HTML字符串.

3. 对分析结果做自己想做的处理.

4. 你也可以做一些其他事情例如定时请求(POST, GET)


二. 抓取HTML字符串


1. 方法1

#!/usr/bin/env python
# Python 2.7.3
# A001_Get_HTML.py
# 检查抓取网页的HTML文本并显示
import urllib2
response = urllib2.urlopen('http://www.baidu.com/')
htmlStr = response.read()
print(htmlStr)


2. 方法2

#!/usr/bin/env python
# Python 2.7.3
# A001_Get_HTML.py
# 检查抓取网页的HTML文本并显示
import urllib2  
req = urllib2.Request('http://www.baidu.com')# Request也可以
response = urllib2.urlopen(req)  
htmlStr = response.read()  
print(htmlStr)


3. GET 方法

www.baidu.com网页中的搜索框中输入"你好", 按一下"百度一下"按钮后产生如下网址:

http://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD&rsv_bp=0&rsv_spt=3&ie=utf-8&rsv_sug3=5&rsv_sug=0&rsv_sug1=5&rsv_sug4=373&inputT=7634

浏览器界面就会显示"你好"的相关搜索结果.

现在使用Python来模式:

#!/usr/bin/env python
# Python 2.7.3
# A003_Get_HTML.py
# 检查抓取网页的HTML文本并显示
import httplib
conn = httplib.HTTPConnection("www.baidu.com")
# 看这里是怎么生成Get数据的
conn.request("GET", "/s?wd=%E4%BD%A0%E5%A5%BD&rsv_bp=0&rsv_spt=3&ie=utf-8&rsv_sug3=5&rsv_sug=0&rsv_sug1=5&rsv_sug4=373&inputT=7634") 
# http://www.baidu.com后面的数据都是GET请求的数据.
r1 = conn.getresponse()# 获得响应的HTML
print(r1.status)# 打印结果
print(r1.reason)
data1 = r1.read()# 获得HTML
f = open('index.html', 'w')# 写入文件(你使用浏览器打开这个文件看看)
f.write(data1)
f.close()

4.  HEAD方法

HEAD方法获取的是请求的url资源的相应报头信息

#!/usr/bin/env python
# Python 2.7.3
# A003_Get_HTML.py
# 检查抓取网页的HTML文本并显示
import httplib
conn = httplib.HTTPConnection("www.python.org")
conn.request("HEAD", "/index.html") 
# HEAD方法获取的是请求的url资源的相应报头信息
r1 = conn.getresponse()# 获得响应的HTML
print(r1.status)# 打印结果
print(r1.reason)
data1 = r1.read()# HEAD方法不能获得HTML
f = open('index.html', 'w')# 写入文件(你使用浏览器打开这个文件看看)
f.write(data1)
f.close()

三. POST方法

1. 首先你要找一个有POST请求的网页.


如果你自己配置了一个Web服务器也可以自己写一个.(我自己不熟悉HTMLWeb, 所以在网上找了一个)

http://www.python.org/index.html

如下图:


图1

它的HTML是这样的:

           <form method="POST" action="/3kpoll">
             <p><input type="text" class="input-text" name="pkg" /></p>
             <p>(enter <a href="http://pypi.python.org/pypi">PyPI package name</a>)</p>
             <p>
               <input type="submit" value="Vote" />
               <a href="/3kpoll">Results</a>
             </p>
           </form>

2. 使用Python模拟这个POST.

根据1中的说明如下代码:

2.1 方法一

(这个方法HTTP监控工具可以监控出来(Fidder Web Debugger))

#!/usr/bin/env python
# Python 2.7.3
# A005_Get_HTML.py
import urllib2,urllib,sys
url = "http://www.python.org/3kpoll"# URL
search = urllib.urlencode([('pkg','ddd')])# POST的数据对
req = urllib2.Request(url)# 建立连接
fd = urllib2.urlopen(req, search)# POST数据
while 1:# 读取响应
    data = fd.read(1024)
    if not len(data):
        break
sys.stdout.write(data)

网站返回:

The package ddd does not exist. Please verify the package name


2.2 方法二

(这个方法HTTP工具没有监控出来(Fidder Web Debugger))

#!/usr/bin/env python
# Python 2.7.3
# A006_Get_HTML.py
import urllib2, urllib, sys
import httplib
url = "http://www.python.org/3kpoll"# URL
params = urllib.urlencode([('pkg','ddd')])# POST的数据对
# 如果有多个数据要POSt可以这样写
#params = urllib.urlencode({'programe': 'python', 'age': 12})# POST的数据对
# 这里是固定的写法(headers还有很多key/value对, 没写的就使用Python默认的)
headers = {"Content-type": "application/x-www-form-urlencoded" , "Accept": "text/plain"}
httpClient = httplib.HTTPConnection("www.python.org", 80, timeout=30)
# 这样也可以
# httpClient = httplib.HTTPConnection("www.python.org:80")
httpClient.request("POST", "/3kpoll", params, headers)
response = httpClient.getresponse()
print(response.status)
print(response.reason)
print(response.read())
print(response.getheaders()) #获取头信息


2.3 方法三


#!/usr/bin/env python
# Python 2.7.3
# A007_Get_HTML.py
import urllib    
import urllib2
url = "http://www.python.org/3kpoll"# URL
params = urllib.urlencode([('pkg','ddd')])# POST的数据对
# 如果有多个数据要POSt可以这样写
# params = urllib.urlencode({'programe': 'python', 'age': 12})
req = urllib2.Request(url, params)  # 发送请求同时传params表单  
response = urllib2.urlopen(req)  # 接受响应的信息 
 
print(response.read())


2.4 方法四 模拟成IE发送

#!/usr/bin/env python
# Python 2.7.3
# A008_Get_HTML.py
# 模拟成IE
import urllib    
import urllib2
url = "http://www.python.org/3kpoll"# URL
# 这里模拟成IE
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'    
headers = { 'User-Agent' : user_agent }    
params = urllib.urlencode([('pkg','ddd')])# POST的数据对
# 如果有多个数据要POSt可以这样写
# params = urllib.urlencode({'programe': 'python', 'age': 12})
req = urllib2.Request(url, params, headers)  # 发送请求同时传params表单  
response = urllib2.urlopen(req)  # 接受响应的信息 
 
print(response.read())

怎样生成这些POST数据需要根据具体点站点的Form?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值