当前位置: 首页 > 知识库问答 >
问题:

python请求对url进行编码

慕铭
2023-03-14

我试图通过参数在谷歌搜索,它的工作,当我搜索一个词,但一个我做空间它坏了我知道有一种方法来编码网址。

import urllib.request
from urllib.parse import urlencode, quote_plus
from fake_useragent import UserAgent
import time
import requests
from bs4 import BeautifulSoup

keyword = "host free"
url = "https://www.google.co.il/search?q=%s" % (keyword)
print(url)

thepage = urllib.request.Request(url, headers=request_headers)
page = urllib.request.urlopen(thepage)

//Continue...

回溯:

https://www.google.co.il/search?q=host free
Traceback (most recent call last):
  File "C:\Users\Maor Ben Lulu\Desktop\Maor\Python\google\Google_Bot_new.py", line 42, in <module>
    page = urllib.request.urlopen(thepage)
  File "C:\Program Files (x86)\Python37-32\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Program Files (x86)\Python37-32\lib\urllib\request.py", line 531, in open
    response = meth(req, response)
  File "C:\Program Files (x86)\Python37-32\lib\urllib\request.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Program Files (x86)\Python37-32\lib\urllib\request.py", line 569, in error
    return self._call_chain(*args)
  File "C:\Program Files (x86)\Python37-32\lib\urllib\request.py", line 503, in _call_chain
    result = func(*args)
  File "C:\Program Files (x86)\Python37-32\lib\urllib\request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 400: Bad Request
[Finished in 0.7s with exit code 1]
[shell_cmd: python -u "C:\Users\Maor Ben Lulu\Desktop\Maor\Python\google\Google_Bot_new.py"]
[dir: C:\Users\Maor Ben Lulu\Desktop\Maor\Python\google]
[path: C:\Program Files (x86)\Python37-32\Scripts\;C:\Program Files (x86)\Python37-32\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;D:\Program Files\Git\cmd;C:\Users\Maor Ben Lulu\AppData\Local\Microsoft\WindowsApps;]

还有一次,我用希伯来文写道:

UnicodeEncodeError:“ascii”编解码器无法对位置14-18中的字符进行编码:序号不在范围内(128)

共有2个答案

澹台欣怿
2023-03-14

请求库可以为您做Gahan提到的。通过字典将查询参数标头传递到request.get()

headers = {
    'User-agent':
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582'
     # other headers (if needed)
}

params = {
  'q': 'how to create minecraft server',   # query 
  'gl': 'us',                              # country to search from (United States in this case)
  'hl': 'en'                               # language
   # other params (if needed)
}

html = requests.get('https://www.google.com/search', headers=headers, params=params)
soup = BeautifulSoup(html.text, 'lxml')

在线IDE中的代码和示例:

from bs4 import BeautifulSoup
import requests, lxml

headers = {
    'User-agent':
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582'
}

params = {
  'q': 'how to create minecraft server',
  'gl': 'us',
  'hl': 'en',
}

html = requests.get('https://www.google.com/search', headers=headers, params=params).text
soup = BeautifulSoup(html, 'lxml')

for result in soup.select('.tF2Cxc'):
  title = result.select_one('.yuRUbf').text
  link = result.select_one('.yuRUbf a')['href']
  print(title, link, sep='\n')

---------
'''
How to Setup a Minecraft: Java Edition Server – Home
https://help.minecraft.net/hc/en-us/articles/360058525452-How-to-Setup-a-Minecraft-Java-Edition-Server
Minecraft Server Download
https://www.minecraft.net/en-us/download/server
Setting Up Your Own Minecraft Server - iD Tech
https://www.idtech.com/blog/creating-minecraft-server
Tutorials/Setting up a server - Minecraft Wiki
https://minecraft.fandom.com/wiki/Tutorials/Setting_up_a_server
# other results
'''

或者,您也可以使用SerpApi的Google Organic Results API实现同样的功能。这是一个免费的付费API。

你的情况的不同之处在于,如果问题不仅仅是在请求标题中传递用户代理,你不必花时间弄清楚这些事情或者如何绕过谷歌的块。

相反,您需要使用所需的参数(params)在结构化JSON上迭代,并获取所需的数据。

要集成的示例代码:

import os
from serpapi import GoogleSearch

params = {
  "engine": "google",
  "q": "tesla",
  "hl": "en",
  "gl": "us",
  "api_key": os.getenv("API_KEY"),
}

search = GoogleSearch(params)
results = search.get_dict()

# scrapes first page of Google results
for result in results["organic_results"]:
  print(result['title'])
  print(result['link'])


---------
'''
How to Setup a Minecraft: Java Edition Server – Home
https://help.minecraft.net/hc/en-us/articles/360058525452-How-to-Setup-a-Minecraft-Java-Edition-Server
Minecraft Server Download
https://www.minecraft.net/en-us/download/server
Setting Up Your Own Minecraft Server - iD Tech
https://www.idtech.com/blog/creating-minecraft-server
Tutorials/Setting up a server - Minecraft Wiki
https://minecraft.fandom.com/wiki/Tutorials/Setting_up_a_server
# other results
'''

免责声明,我为SerpApi工作。

印劲
2023-03-14

有一种方法可以使用urllib对url进行编码。作语法分析报价,但有一个请求模块在所有此类情况下都非常有用,您可以按如下方式使用它:

import requests
base_url = 'https://www.google.co.il/search'
res = requests.get(base_url, params={'q': 'host free'})  # query parameter and value in dict format to be passed as params kwarg

如上所示,您可以将查询参数作为关键字参数传递

 类似资料:
  • 问题内容: 我正在尝试使用python中的request.get()获取以下格式的URL: http://api.example.com/export/?format=json&key=site:dummy+type:example+group:wheel 但是,URL得到了百分比编码,但没有得到预期的响应。 如果我直接传递URL,则可以使用: 是否可以通过某种方式以原始格式传递参数-无需百分比编

  • 设置: springboot应用程序;用于测试的Spring Boot测试TestRest模板 如果启动服务器并使用URL编码的值对endpoint进行卷曲,则会在响应中获得非URL编码的值。 如果我用TestRestTemplate查询完全相同的东西,foo会得到一个URL编码的值来处理,而在现实世界中事情开始出错。。。 com.example.应用 通用域名格式。实例特斯塔普 建筑格拉德尔 服

  • 问题内容: 我正在尝试使用请求获取正确的编码。 不管我做什么,丹麦字符的编码都不对。 有什么想法吗? 问题答案: 也许您的麻烦在于标题。假设您的标题为 如果是这样,您有2种方法可以解决此问题: 删除此标题 使用以下代码解压缩数据: });

  • 我想为我的网站创建一个编码的网址。例如,对于这个URL:"http://google.com/index.html" 我想通过URL编码将此URL提供给客户端。

  • Java为URL编码字符串提供了类。但是将密码存储为字符串被认为是不安全的。通过输出流通过POST发送密码的代码是否足够安全? 一方面,它在使用字符串。另一方面,这些字符串只有1个字符长,编码后在概念上是相同的。而且,在我看来,这可能会在多字节字符上失败。攻击者是否能够在内存中找到这些1-char字符串并重建原始密码?有没有更好的办法做到这一点?

  • 问题内容: 我正在尝试通过GET请求中的URL参数传递API密钥。 但是,我注意到在发送请求时,Axios会在我的API密钥中对字符进行编码。这会导致API拒绝我的请求,因为它无法识别我的密钥。 如何防止Axios对我的GET参数进行编码? 问题答案: 您可以使用自定义参数序列化器,如下所示: 可以在实例级别设置: 或在全球范围内: 另一个选择是将api键直接添加到URL: 您可以使用`param