所以我正在从在线课程中做这个未评分的作业(所以请不要犹豫,发布我的这个克星的解决方案)。
分配使用导入套接字从网页打开文件,提示用户输入 url,打印 3000 个前字符,包括标题,但计算文件中的所有字符。
所以首先我做了这个:
import socket
import re
url = raw_input('Enter - ')
try:
hostname = re.findall('http://(.+?)/', url)
hostname = hostname[0]
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect((hostname, 80))
mysock.send('GET ' + url + ' HTTP/1.0nn')
count = 0
text = str()
while True:
data = mysock.recv(512)
if ( len(data) < 1 ) :
break
count += len(data)
if count <= 3000:
print data
mysock.close()
except:
print 'Please enter a valid URL'
print count
但是每次我在 mysock.recv() 中调整缓冲区时,输出都会发生变化,并且文本中会出现随机空格。
然后我这样做了,它消除了时髦的随机拆分,但输出仍然因内部缓冲区而异。
import socket
import re
url = raw_input('Enter - ')
try:
hostname = re.findall('http://(.+?)/', url)
hostname = hostname[0]
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect((hostname, 80))
mysock.send('GET ' + url + ' HTTP/1.0nn')
count = 0
text = str()
while True:
data = mysock.recv(512)
if ( len(data) < 1 ) :
break
count += len(data)
if count <= 3000:
data.rstrip()
text = text + data
mysock.close()
except:
print 'Please enter a valid URL'
print text
print count
所以我已经使用了几个小时,无论缓冲区的大小如何,如果没有时髦的行拆分空格,我仍然无法获得完全相同的输出。
我使用的文件:http://www.py4inf.com/code/romeo-full.txt
我在同一本书上学习,我在做同样的练习。问题是 3 岁,但不要给 af,也许对某人有帮助。
首先,您不能以这种方式打印data
。你需要这样的东西:
while True:
data = mysock.recv(512)
if len(data) < 1:
break
print(data.decode(),end='')
此外,如果您更改缓冲区512
,则结果不相同是完全正常的,因为计数变量取决于它。无论如何,作者在显示 3000 个字符后要求停止。
我的完整代码(仅适用于HTTP,HTTPS不处理):
import socket
import sys
import validators
import urllib.parse
url = input('Insert url to fetch: ')
# Test valid url
try:
valid = validators.url(url)
if valid != True:
raise ValueError
except ValueError:
print('url incorrect')
sys.exit()
# Test socket connection
try:
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('nSocket successfully created')
except socket.error as err:
print('Socket creation failed with error %s' %(err))
# Extract hostname of url
parsed_url = urllib.parse.urlparse(url)
print('Resolving ->', parsed_url.netloc)
# Test if we can resolve the host
try:
host_ip = socket.gethostbyname(parsed_url.netloc)
except socket.gaierror:
print('Unable to resolve', parsed_url.netloc)
sys.exit()
# Connect to host
mysock.connect((parsed_url.netloc, 80))
# Crafting our command to send
cmd = ('GET ' + url + ' HTTP/1.0rnrn').encode()
# Sending our command
mysock.send(cmd)
count = 0
# Receive data
while True:
data = mysock.recv(500)
count += len(data)
if len(data) < 1:
break
if count > 3000:
break
print(data.decode(),end='')
mysock.close()
可能是解决方案,也许