我正在尝试使用 beautifulsoup4 和 python3 抓取一个非常长的网页。由于网站的大小,http.client当我尝试在网站中搜索某些内容时,会出现错误:
文件“/anaconda3/lib/python3.6/http/client.py”,第 456 行,在读取返回 self._readall_chunked() 文件“/anaconda3/lib/python3.6/http/client.py”,第 570 行,在 _readall_chunked 中引发 IncompleteRead(b''.join(value)) http.client.IncompleteRead: IncompleteRead(16109 字节读取)
有什么办法可以解决这个错误吗?
我有以下代码,用于尝试将来自 http.client.HTTPSConnection get 请求的响应分块到 API(请注意,响应是gzip 编码的:
connection = http.client.HTTPSConnection(api, context = ssl._create_unverified_context())
connection.request('GET', api_url, headers = auth)
response = connection.getresponse()
while chunk := response.read(20):
data = gzip.decompress(chunk)
data = json.loads(chunk)
print(data)
Run Code Online (Sandbox Code Playgroud)
这总是给出一个错误,它是not a gzipped file (b'\xe5\x9d')。不知道如何对数据进行分块并仍然实现我在这里尝试做的事情。基本上,我进行了分块,这样我就不必将整个响应加载到内存中。请注意,我不能使用任何其他库,如 requests、urllib 等。
使用http.client在Python 3.3+(或任何其他内置的Python HTTP客户端库),我怎么可以一次读取分块的HTTP响应正好一个HTTP块?
我正在扩展服务器的现有测试装置(使用python编写http.client),该服务器使用HTTP的分块传输编码来编写其响应。为了简单起见,假设我希望能够在客户端收到HTTP块时打印一条消息。
我的代码遵循相当标准的模式来读取较大的响应:
conn = http.client.HTTPConnection(...)
conn.request(...)
response = conn.getresponse()
resbody = []
while True:
chunk = response.read(1024)
if len(chunk):
resbody.append(chunk)
else:
break
conn.close();
Run Code Online (Sandbox Code Playgroud)
但这将读取1024字节的块,无论服务器是否发送10字节的块或10MiB的块。
我正在寻找的东西将如下所示:
while True:
chunk = response.readchunk()
if len(chunk):
resbody.append(chunk)
else
break
Run Code Online (Sandbox Code Playgroud)
如果无法使用http.client,则可以使用另一个内置的http客户端库吗?如果内置客户端库无法实现,可pip安装模块是否可以实现?
我正在尝试使用 python 将 xml 发布到站点。我必须包含证书,但不确定如何执行此操作。在我的计算机上本地指定证书的文件路径是否足够?
任何人都可以向我展示如何在请求中包含证书的示例吗?
import http.client, urllib.parse
xml="""<?xml version="1.0" encoding="UTF-8"?>
<home>
<bathroom>1</bathroom>
<kitchen>1</kitchen>
<street>515</street>
</home>);"""
headers = {"username": "password"}
conn = http.client.HTTPSConnection("someurl.com", cert_file="D:\Users\Username\certificate.p12")
conn.request("POST", "/to/this/place", xml, headers)
response = conn.getresponse()
print(response.status, response.reason)
data = response.read()
print(data)
conn.close()
Run Code Online (Sandbox Code Playgroud) 我正在使用 context.Context 取消 http 请求
我发现虽然我得到了“上下文取消”,但底层套接字连接仍然可用,几秒钟后我可以得到响应。是否以这种方式设计来在请求发出后读取响应?
这是代码
func SendRequest(ctx context.Context, url string) {
req, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Println(err)
}
req = req.WithContext(ctx)
res, err := client.Do(req)
select {
case <-ctx.Done():
fmt.Printf("%s Canceled\n", url)
//client.Transport.(*http.Transport).CancelRequest(req)
//client.Transport.(*http.Transport).CloseIdleConnections()
}
if res != nil {
defer res.Body.Close()
}
if err != nil {
fmt.Printf("Failed: %v\n", err)
} else {
io.Copy(ioutil.Discard, res.Body)
fmt.Printf("return status: %d\n", url, res.StatusCode)
}
}
Run Code Online (Sandbox Code Playgroud)
我请求的 URL 将在几秒钟后返回,因此我仍然可以读取响应正文,并且在进程退出后连接已关闭。
这是重现问题的简单代码
func client() {
ctx, cancel …Run Code Online (Sandbox Code Playgroud) 我正在学习并在这个恐慌错误中挣扎......它工作了一段时间,但很快就出现了这样的异常 panic: runtime error: invalid memory address or nil pointer dereference
该函数简单地遍历代理映射,直到它成功获得“地址”的内容。一定不是很惯用,尤其是用map代替slice和last return,但我希望这不是panic Crush的原因......如果我遗漏了一些可能重要的东西,请告诉我,我会更新帖子,我只是不想用不必要的信息淹没它。proxies 是一个带有 map 字段的结构体,具有并发安全读取/删除的方法。
func getContent(address string) string {
localProxies := proxies.Get()
for proxy := range localProxies {
proxyUrl, _ := url.Parse("http://" + proxy)
transport := http.Transport{
Dial: dialTimeout,
Proxy: http.ProxyURL(proxyUrl),
}
httpClient := http.Client{Transport: &transport, Timeout: timeout}
req, err := http.NewRequest("GET", address, nil)
if err != nil {
fmt.Println("Request error: ", err.Error())
}
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0")
res, err := httpClient.Do(req) …Run Code Online (Sandbox Code Playgroud) 我正在尝试从以下网站检索 JSON 数据:www.themoviedb.org 我只能使用 http.client 和 json 作为库。我有一个有效的 API 密钥,但我不想在这个问题中透露。
url = "https://api.themoviedb.org/3/movie/550?api_key=xxxx"
conn = http.client.HTTPConnection(url,port=80)
## things work well until i call request
conn.request("GET","/")
Run Code Online (Sandbox Code Playgroud)
错误:
for res in _socket.getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno 11001] getaddrinfo 失败
我正在尝试提出授权请求并提出TypeError: can't concat str to bytes. 我在网上搜索并发现了类似的问题,但没有一个可以帮助解决我的问题。我目前正在 Jupyter 工作(如果有帮助的话?)而且我是一个 python 菜鸟,所以请温柔一些......
这是我的代码:
import http.client as httplib
import urllib.request, urllib.parse, urllib.error, base64
import requests as rq
base_url = 'api/url'
end_point = '/endpoint'
full_url = base_url + end_point
request_body = {
'UserName':'un',
'Password':'pw'
}
header = {
'tenant': 'tenant name' #required by vendor
}
print(type(base_url))
print(type(end_point))
print(type(full_url))
print(type(request_body))
print(type(header))
try:
conn = httplib.HTTPSConnection(base_url)
conn.request(method='POST',url=full_url, body=request_body, headers=header)
response = conn.getresponse()
data = response.read()
print(type(data))
print(data)
conn.close()
except Exception as e:
print("[Errno …Run Code Online (Sandbox Code Playgroud)