检索到的URL,无法构建有效负载以使用请求modu

2024-06-01 02:27:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,谢谢你的耐心

我使用请求模块检索了一个网页。我用漂亮的汤收获了几百个对象(链接)。我使用uritools为我要下载的目标页面创建了一个完整url数组

我不希望每个读到这篇文章的人都用请求轰炸web服务器,所以我将展示一个假设的示例,它只适用于2个href。数组如下所示:

hrefs2 = ['http://ku.edu/pls/WP040?PT001F01=910&pf7331=11',
 'http://ku.edu/pls/WP040?PT001F01=910&pf7331=12']

如果我把这些输入到100行代码中,我就知道如何检索每一页:

from lxml import html
import requests

url = 'http://ku.edu/pls/WP040/'
payload = {'PT001F01' : '910', 'pf7331' : '11')

r = requests.get(url, params = payload)

那就看第二页

payload = {'PT001F01' : '910', 'pf7331' : '12')
r = requests.get(url, params = payload)

继续输入有效载荷对象。不是所有我要处理的href都是连续的,也不是所有的有效负载在最后一个整数中都是不同的

我想自动化这一点,但我不知道如何从hrefs2阵列创建有效负载

在摆弄uritools时,我发现urisplit可以为我提供需要解析为有效负载的部分:

   [urisplit(x)[3] for x in hrefs2] 

   ['PT001F01=910&pf7331=11',
     'PT001F01=910&pf7331=12']

每一个都必须变成一个有效载荷对象,我不知道该怎么办

我使用Python3和uritools,因为这似乎是urltools的符合标准的替代品

我使用shell脚本来获取带有wget的页面,这确实有效,但它太不符合Python风格了,所以我在这里询问该怎么做。我是说,这确实有效:

import subprocess

for i in hrefs2:   
    subprocess.call(["wget", i])

Tags: 对象importhttpurl页面requestspayloadku
1条回答
网友
1楼 · 发布于 2024-06-01 02:27:30

您可以将完整的url传递给requests.get(),而无需拆分参数

>>> requests.get('http://ku.edu/pls/WP040?PT001F01=910&pf7331=12')
<Response [200]>

如果出于某种原因您不想这样做,则需要以某种方式拆分参数。我相信有更好的方法,但首先想到的是:

a = ['PT001F01=910&pf7331=11',
    'PT001F01=910&pf7331=12']
# list to store all url parameters after they're converted to dicts
urldata = []

#iterate over list of params
for param in a:
  data = {}
  # split the string into key value pairs
  for kv in param.split('&'):
    # split the pairs up
    b = kv.split('=')
    # first part is the key, second is the value
    data[b[0]] = b[1]
  # After converting every kv pair in the parameter, add the result to a list.
  urldata.append(data)

你可以用更少的代码来做这件事,但我想弄清楚到底发生了什么。我确信已经有一个模块在那里为你做这件事了

相关问题 更多 >