微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 requests_html、Beautiful Soup 绕过 AKAMAI 机器人检测以进行数据抓取

如何解决如何使用 requests_html、Beautiful Soup 绕过 AKAMAI 机器人检测以进行数据抓取

我正在从 Rakuten 日本电子商务网站抓取数据。我正在使用 requests-htmlBeautiful 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 上尝试了您的代码,并且正在获取示例输出。

enter image description here

所以,这里有几件事需要检查:

  • 确保您的 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 举报,一经查实,本站将立刻删除。