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

时间:2018-02-07 18:14:51

标签: python

我是Python新手,感谢您的耐心等待。

我使用requests模块检索了一个网页。我用Beautiful Soup收集了几百个href对象(链接)。我使用uritools为我想下载的目标页面创建了一个完整的URL数组。

我不希望所有阅读此笔记的人都要求使用请求轰炸Web服务器,因此我将展示一个假设的示例,该示例仅适用于2个hrefs。该数组如下所示:

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])

1 个答案:

答案 0 :(得分:1)

您可以将完整的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)

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