我是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])
答案 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)
你可以用更少的代码来做到这一点,但我想清楚发生了什么。我确信那里已经有一个模块可以为你做这个。