使用套接字在线打印文件中的 3000 个前字符



所以我正在从在线课程中做这个未评分的作业(所以请不要犹豫,发布我的这个克星的解决方案)。

分配使用导入套接字从网页打开文件,提示用户输入 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()

可能是解决方案,也许

最新更新