一. 抓取网页的三个步骤(个人表面的理解)
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网页中的搜索框中输入"你好", 按一下"百度一下"按钮后产生如下网址:
浏览器界面就会显示"你好"的相关搜索结果.
现在使用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服务器, 也可以自己写一个.(我自己不熟悉HTML和Web, 所以在网上找了一个)
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?