如何解决如何使用 requests_html、Beautiful Soup 绕过 AKAMAI 机器人检测以进行数据抓取
我正在从 Rakuten 日本电子商务网站抓取数据。我正在使用 requests-html 和 Beautiful soup。
问题是当我从本地电脑 (127.0.0.1) 请求时,它工作正常。但是当我从我的 ec2 服务器请求获取 Reference #<esi:vars name="AKAMAI_DEBUG_STRING"/>
这条消息并且没有找到数据或 HTML 页面时。还有另一种情况,当我使用 wget
并从服务器请求页面 URL 时,我会得到一个完整的页面。但是我的脚本不起作用。
这是我的代码示例:
from bs4 import BeautifulSoup
from requests_html import HTMLSession
def get_search_url(query_keyword):
base_url = 'https://search.rakuten.co.jp/search/mall/'
headers = {
'upgrade-insecure-requests': '1','user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/83.0.4103.61 Safari/537.36','accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','accept-language': 'en-GB,en-US;q=0.9,en;q=0.8',}
session = HTMLSession()
session.headers.update(headers)
request_url = base_url + query_keyword
resp = session.get(request_url)
soup = BeautifulSoup(resp.text,"lxml")
return soup
def feature_product_details(url):
output_list = []
for i in url.find_all("div",attrs={"class": "dui-card searchresultitem"}):
product_title = i.find("div",attrs={"class": "content title"})
if product_title is not None:
product_title = product_title.getText()
else:
product_title = ""
output = {
'title': product_title,}
output_list.append(output)
print(output_list)
return output_list
def main_rakuten_product_search(query):
query_keyword = query
page = get_search_url(query_keyword)
product_lists = feature_product_details(page)
return product_lists
if __name__ == '__main__':
queries = '【レビュー特典中】スマートキー 電波遮断ケース 電波遮断ボックス リレーアタック防止用 キーケース '
main_rakuten_product_search(queries)
运行本地服务器时的示例输出:
[
{
"title": "【レビュー特典中】スマートキー 電波遮断ケース 電波遮断ボックス リレーアタック防止用 キーケース リレーアタック対策 ボックス 箱 電波遮断ケース RFIDブロッキング 高級PUレザー 高級車盗難防止 カーセキュリティ 高級感溢れ レクサス(グレー)",}
]
但是在我的服务器上运行时没有得到任何响应:只显示
此消息Reference #<esi:vars name="AKAMAI_DEBUG_STRING"/>
如果有人知道如何做到这一点,我将不胜感激。
解决方法
我已经在 EC2
(东京)的 ap-northeast-1
上尝试了您的代码,并且正在获取示例输出。
所以,这里有几件事需要检查:
- 确保您的 EC2 已打开正确的端口
- 仔细检查标题(我稍微修改了您的标题 - 请参阅下面的代码)
- 检查您的查询输入;也许其中一些格式不正确?
- 不要用来自一个 EC2 的过多请求来喷洒 rakuten 服务器;也许他们已经在阻止你
这是稍微调整后的代码:
from bs4 import BeautifulSoup
from requests_html import HTMLSession
def get_search_url(query_keyword):
base_url = 'https://search.rakuten.co.jp/search/mall/'
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/83.0.4103.61 Safari/537.36','referer': 'https://www.rakuten.co.jp/'
}
session = HTMLSession()
session.headers.update(headers)
return BeautifulSoup(session.get(base_url + query_keyword).content,"lxml")
def feature_product_details(url):
output_list = []
for i in url.find_all("div",attrs={"class": "dui-card searchresultitem"}):
product_title = i.find("div",attrs={"class": "content title"})
if product_title is not None:
product_title = product_title.getText()
else:
product_title = ""
output_list.append({'title': product_title})
return output_list
def main_rakuten_product_search(query):
return feature_product_details(get_search_url(query))
if __name__ == '__main__':
queries = '【レビュー特典中】スマートキー 電波遮断ケース 電波遮断ボックス リレーアタック防止用 キーケース '
print(main_rakuten_product_search(queries))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。