Python-使用套接字获取源代码
我想发送http get请求并从网页接收源代码,这必须通过套接字完成。我将缓冲区大小设置为4096,但我的脚本只下载页面中的一小部分Python-使用套接字获取源代码,python,sockets,Python,Sockets,我想发送http get请求并从网页接收源代码,这必须通过套接字完成。我将缓冲区大小设置为4096,但我的脚本只下载页面中的一小部分 import socket sock = socket.socket ( socket.AF_INET, socket.SOCK_STREAM ) sock.connect ( ( "edition.cnn.com", 80 ) ) host = socket.gethostbyname("edition.cnn.com") sock.sendall('GET
import socket
sock = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
sock.connect ( ( "edition.cnn.com", 80 ) )
host = socket.gethostbyname("edition.cnn.com")
sock.sendall('GET http://edition.cnn.com/index.html HTTP/1.1\r\n'\
+ 'User-Agent: agent123\r\n'\
+ 'Host: '+host+'\r\n'\
+ '\r\n')
print sock.recv(4096)
sock.close()
运行此代码后,我得到的数据是
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 01 Jan 2014 18:31:25 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: CG=GR:44:Réthimnon; path=/
Last-Modified: Wed, 01 Jan 2014 18:31:22 GMT
Vary: Accept-Encoding
Cache-Control: max-age=60, private
Expires: Wed, 01 Jan 2014 18:32:25 GMT
ac2a
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<title>CNN.com International - Breaking, World, Business, Sports, Entertainment and Video News</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<meta http-equiv="last-modified" content="2014-01-01T18:28:34Z"/>
<meta http-equiv="refresh" content="1800;url=http://edition.cnn.com/?refresh=1"/>
<meta name="robots" content="index,follow"/>
<meta name="googlebot" content="noarchive"/>
<meta name="description" content="CNN.com International delivers breaking news from across the globe and information on the latest top stories, business, sports and entertainment headlines. Follow the news as it happens through: special reports, videos, audio, photo galleries plus interactive maps and timelines."/>
<meta name="keywords" content="CNN, CNN news, CNN International, CNN International news, CNN Edition, Edition news, news, news online, breaking news, U.S. news, world news, global news, weather, business, CNN Money, sports, politics, law, technology, entertainment, education,
我得到了这样的回应
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/index.html
Content-Type: text/html; charset=UTF-8
Date: Wed, 01 Jan 2014 18:38:57 GMT
Expires: Fri, 31 Jan 2014 18:38:57 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 229
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/index.html">here</A>.
</BODY></HTML>
HTTP/1.1 301永久移动
地点:http://www.google.com/index.html
内容类型:text/html;字符集=UTF-8
日期:2014年1月1日星期三18:38:57 GMT
到期时间:2014年1月31日星期五18:38:57 GMT
缓存控制:公共,最大年龄=2592000
服务器:gws
内容长度:229
X-XSS-Protection:1;模式=块
X-Frame-Options:SAMEORIGIN
备选议定书:80:quic
301移动
301移动
文档已移动
.
这表示页面被移动到我想要下载的相同地址…sock.recv(4096)
将读取最多4096字节的;这取决于已经到达的数据量以及调用实际可以返回的数据量。不能保证4096字节实际上可以一次性读取
在收到所有数据之前,您必须继续从套接字读取:
data = ''
chunk = sock.recv(4096)
while chunk:
data += chunk
if len(data) >= 4096:
break
chunk = sock.recv(4096)
您对http://google.com/index.html
重定向到www.google.com
,一个不同的主机名。相应地调整您的请求
如果你想实现一个完整的HTTP客户端,你必须解析状态行,通过解析位置:
头来处理301
重定向响应,并建立一个新连接来请求提供给你的新URL。sock.recv(4096)
将读取最多4096字节;这取决于已经到达的数据量以及调用实际可以返回的数据量。不能保证4096字节实际上可以一次性读取
在收到所有数据之前,您必须继续从套接字读取:
data = ''
chunk = sock.recv(4096)
while chunk:
data += chunk
if len(data) >= 4096:
break
chunk = sock.recv(4096)
您对http://google.com/index.html
重定向到www.google.com
,一个不同的主机名。相应地调整您的请求
如果你想实现一个完整的HTTP客户端,你必须解析状态行,通过解析位置:
头来处理301
重定向响应,并建立一个新连接来请求提供给你的新URL。sock.recv(4096)
将读取最多4096字节;这取决于已经到达的数据量以及调用实际可以返回的数据量。不能保证4096字节实际上可以一次性读取
在收到所有数据之前,您必须继续从套接字读取:
data = ''
chunk = sock.recv(4096)
while chunk:
data += chunk
if len(data) >= 4096:
break
chunk = sock.recv(4096)
您对http://google.com/index.html
重定向到www.google.com
,一个不同的主机名。相应地调整您的请求
如果你想实现一个完整的HTTP客户端,你必须解析状态行,通过解析位置:
头来处理301
重定向响应,并建立一个新连接来请求提供给你的新URL。sock.recv(4096)
将读取最多4096字节;这取决于已经到达的数据量以及调用实际可以返回的数据量。不能保证4096字节实际上可以一次性读取
在收到所有数据之前,您必须继续从套接字读取:
data = ''
chunk = sock.recv(4096)
while chunk:
data += chunk
if len(data) >= 4096:
break
chunk = sock.recv(4096)
您对http://google.com/index.html
重定向到www.google.com
,一个不同的主机名。相应地调整您的请求
如果你想实现一个完整的HTTP客户端,你必须解析状态行,通过解析
位置:
头来处理301
重定向响应,并建立一个新的连接来请求提供给你的新URL。edition.cnn.com使用HTTP/1.0,www.google.com使用HTTP/1.1。也许有人能插话告诉你该用哪一个
这适用于:www.google.com
import socket
import time
domain = 'www.google.com'
# must specify index.html for google
full_url = 'http://www.google.com/index.html'
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect((domain, 80))
mysock.send('GET ' + full_url + ' HTTP/1.1\n\n')
while True:
data = mysock.recv(512)
time.sleep(2.0) # 2 second delay
if len(data) < 1:
break
print data
mysock.close()
导入套接字
导入时间
域名='www.google.com'
#必须为google指定index.html
全文http://www.google.com/index.html'
mysock=socket.socket(socket.AF\u INET,socket.SOCK\u流)
mysock.connect((域,80))
send('GET'+full_url+'HTTP/1.1\n\n')
尽管如此:
data=mysock.recv(512)
时间。睡眠(2.0)#2秒延迟
如果len(数据)<1:
打破
打印数据
mysock.close()
这适用于:edition.cnn.com
import socket
import time
domain = 'www.google.com'
# must specify index.html for google
full_url = 'http://www.google.com/index.html'
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect((domain, 80))
mysock.send('GET ' + full_url + ' HTTP/1.1\n\n')
while True:
data = mysock.recv(512)
time.sleep(2.0) # 2 second delay
if len(data) < 1:
break
print data
mysock.close()
警告:产量大;考虑调整ReV(512)到更大的数字或改变时间。睡眠(2)到1秒。
import socket
import time
domain = 'cnn.com'
full_url = 'http://edition.cnn.com/'
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect((domain, 80))
mysock.send('GET ' + full_url + ' HTTP/1.0\n\n')
while True:
data = mysock.recv(512)
time.sleep(2.0) # 2 second delay
if len(data) < 1:
break
print data
mysock.close()
导入套接字
导入时间
域名='cnn.com'
全文http://edition.cnn.com/'
mysock=socket.socket(socket.AF\u INET,socket.SOCK\u流)
mysock.connect((域,80))
send('GET'+full_url+'HTTP/1.0\n\n')
尽管如此:
data=mysock.recv(512)
时间。睡眠(2.0)#2秒延迟
如果len(数据)<1:
打破
打印数据
mysock.close()
两个进程都以退出代码0完成。edition.cnn.com使用HTTP/1.0,www.google.com使用HTTP/1.1。也许有人能插话告诉你该用哪一个 这适用于:www.google.com
import socket
import time
domain = 'www.google.com'
# must specify index.html for google
full_url = 'http://www.google.com/index.html'
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect((domain, 80))
mysock.send('GET ' + full_url + ' HTTP/1.1\n\n')
while True:
data = mysock.recv(512)
time.sleep(2.0) # 2 second delay
if len(data) < 1:
break
print data
mysock.close()
导入套接字
导入时间
域名='www.google.com'
#必须为google指定index.html
全文http://www.google.com/index.html'
mysock=socket.socket(socket.AF\u INET,socket.SOCK\u流)
mysock.connect((域,80))
send('GET'+full_url+'HTTP/1.1\n\n')
尽管如此:
data=mysock.recv(512)
时间。睡眠(2.0)#2秒延迟
如果len(数据)<1:
打破
打印数据
mysock.close()
这适用于:edition.cnn.com
import socket
import time
domain = 'www.google.com'
# must specify index.html for google
full_url = 'http://www.google.com/index.html'
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect((domain, 80))
mysock.send('GET ' + full_url + ' HTTP/1.1\n\n')
while True:
data = mysock.recv(512)
time.sleep(2.0) # 2 second delay
if len(data) < 1:
break
print data
mysock.close()
警告:产量大;考虑调整ReV(512)到更大的数字或改变时间。睡眠(2)到1秒。
import socket
import time
domain = 'cnn.com'
full_url = 'http://edition.cnn.com/'
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect((domain, 80))
mysock.send('GET ' + full_url + ' HTTP/1.0\n\n')
while True:
data = mysock.recv(512)
time.sleep(2.0) # 2 second delay
if len(data) < 1:
break
print data
mysock.close()
导入套接字
导入时间
域名='cnn.com'
完整url=