我想从 DuckDuckGo 搜索结果中抓取第一个链接。我写了下面的代码:
import requests
from bs4 import BeautifulSoup
class Bse:
def currentPrice(self,symbol):
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:84.0) Gecko/20100101 Firefox/84.0"
}
duckDuckUrl=f'https://duckduckgo.com/?q=bse+{symbol}+stock+price'
response=requests.get(duckDuckUrl,headers=headers)
soup=BeautifulSoup(response.text,"html.parser")
bseIndiaLink=soup.find_all('a')
# bseIndiaLink=soup.find_all('a',class_="result__a") #giving empty list
print(bseIndiaLink)
bse=Bse()
bse.currentPrice('reliance')
首先我在不带 class_ 参数的 beautifulSoup 中使用了 find_all() 。它返回给我一些对我没有任何用处的随机锚标记的列表。 我还尝试了 find_all() 和 class_ 参数,但它返回了一个空列表。
我试图打印汤对象。它打印的是网页的 HTML,而不是那些包含 div 的结果。我不知道为什么 BeautifulSoup 没有抓取包含 div 的结果。请看截图,突出显示的 HTML 语法是我想要抓取的:
我找到了一个答案,即 DuckDuckGo 使用 javascript 作为它的搜索结果,而 beautifulSoup 无法抓取 javascript,但在 StackOverflow 上的其他帖子中,我发现人们能够从它的结果中抓取链接。
但是如果我使用 Google 而不是 DuckDuckGo ,我就可以抓取所需的链接。
我想知道为什么我无法从 DuckDuckGo 中抓取,而是使用相同的代码从 Google 抓取。我很好奇。
如果有人知道我忽略或遗漏了什么,请告诉我。它将对我的学习之旅有所帮助。
谢谢
答案 0 :(得分:1)
这应该会根据您当前的搜索关键字生成结果。您需要发送 post http 请求以及适当的参数以访问内容。我在有效负载中使用了一些字符串格式,以便您当前的尝试成功。
import requests
from bs4 import BeautifulSoup
class Bse:
def __init__(self):
self.duckDuckUrl = 'https://html.duckduckgo.com/html/'
self.payload = {'q': 'bse {} stock price','b': ''}
self.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:84.0) Gecko/20100101 Firefox/84.0'}
def currentPrice(self,symbol):
self.payload['q'] = self.payload['q'].format(symbol)
res = requests.post(self.duckDuckUrl,data=self.payload,headers=self.headers)
soup = BeautifulSoup(res.text,'html.parser')
return soup.find('a',class_='result__a').get("href")
if __name__ == '__main__':
bse = Bse()
print(bse.currentPrice('reliance'))
使用获取请求:
link = "https://html.duckduckgo.com/html/?"
params = {'q': 'nse {} stock price'}
def fetch_first_link(s,symbol):
params['q'] = params['q'].format(symbol)
res = s.get(link,params=params)
soup = BeautifulSoup(res.text,"lxml")
item = soup.select_one(".result__title > a.result__a").get("href")
return item
if __name__ == '__main__':
with requests.Session() as s:
s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
print(fetch_first_link(s,'reliance'))