Mr 氵。函 2024-08-08 12:49 采纳率: 0%
浏览 29
已结题

被google屏蔽ip

目前在第二步骤就出现被google屏蔽ip问题这个情况如何修改?

1.从Azure Blob存储中获取最新的关键词报告。
2.对每个关键词进行Google搜索,提取排名信息和前三个搜索结果的页面信息。
3.从站点地图XML文件中提取URL,并获取每个URL的页面信息。
4.将所有收集到的数据整理成DataFrame,以便进一步分析和处理。

目前已经尝试了的方法
使用代理IP
增加请求间隔
用户代理(User-Agent)轮换

上述都不能解决问题


{
遍历关键词列表 keywords:
    尝试:
        随机等待 3055 秒

        初始化变量:
            companyFound = False
            foundedRank = 0
            foundedCompanyUrl = ''
            rank = 0
            urlsDict = {'Number 1 Url': '', 'Number 2 Url': '', 'Number 3 Url': ''}
            page_num = 0
            found = False
            empty_first_url_count = 0  # 初始化计数器,记录连续出现第一名 URL 为空的次数

        循环遍历搜索结果页面,直到达到 num_of_pages 页:
            构造 Google 搜索结果页面的 URL

            启动无头浏览器
            打开搜索结果页面 URL

            使用 BeautifulSoup 解析页面内容
            提取所有搜索结果

            遍历每个搜索结果:
                如果在第一页,且结果在前三名:
                    获取结果的 URL 并打开
                    初始化 urlsDict2 字典

                    获取页面源代码并使用 BeautifulSoup 解析
                    提取页面标题、H1 标签、OG 标题和OG 描述
                    将数据添加到 urlsDict2

                    将 urlsDict2 添加到 topUrlsData 列表中

                增加排名计数器 rank
                获取结果的公司 URL

                如果找到的公司 URL 等于目标域名且 found 为 False:
                    设置 found 为 True
                    设置 companyFound 为 True
                    记录排名 foundedRank
                    记录公司 URL foundedCompanyUrl
                    跳出内部循环

            如果 found 为 True, 跳出外部循环
            增加页面计数器 page_num

            如果第一页的第一名 URL 为空:
                增加 empty_first_url_count 计数器
                否则:
                    重置 empty_first_url_count 计数器为 0
                
                如果 empty_first_url_count 连续达到 3:
                    报错并停止循环: error: IP is blocked by Google

        打印关键词及其排名
        如果未找到公司 URL:
            设置 foundedRank 和 foundedCompanyUrl 为 None

        将结果添加到 DataFrame 中:
            df.loc[i, 'Keywords'] = 关键词
            df.loc[i, 'Rank'] = 排名
            df.loc[i, 'Date'] = 当前日期
            df.loc[i, 'CompanyURL'] = 公司 URL
            df.loc[i, 'Number 1 Url'] = 第一名 URL
            df.loc[i, 'Number 2 Url'] = 第二名 URL
            df.loc[i, 'Number 3 Url'] = 第三名 URL

        增加计数器 i

    如果发生异常:
        将错误信息添加到 DataFrame 中:
            df.loc[i, 'Keywords'] = 关键词
            df.loc[i, 'Rank'] = 错误信息
            df.loc[i, 'Date'] = 当前日期
            df.loc[i, 'CompanyURL'] = 错误信息
            df.loc[i, 'Number 1 Url'] = None
            df.loc[i, 'Number 2 Url'] = None
            df.loc[i, 'Number 3 Url'] = None

        增加计数器 i
}
  • 写回答

18条回答 默认 最新

  • 喵手 新星创作者: 后端开发技术领域 2024-08-08 17:53
    关注
    获得0.45元问题酬金

    该回答引用ChatGPT辅助答疑,若有帮助,还请题主采纳。


    被Google屏蔽IP通常是因为在短时间内发送了过多的请求,触发了Google的反爬虫机制。你已经尝试了一些常见的解决方法,如使用代理IP、增加请求间隔和用户代理轮换,但问题依然存在。以下是一些进一步的建议:

    1. 增加随机的请求间隔

    尝试增加请求间隔的随机性和长度。比如,将等待时间从30到55秒改为60到120秒之间:

    import random
    import time
    
    def random_wait():
        wait_time = random.randint(60, 120)
        time.sleep(wait_time)
    

    2. 使用高级代理服务

    普通的代理IP可能无法满足需求,可以尝试使用更高级的代理服务,例如动态住宅IP代理。这些代理通常更难被检测到。

    3. 实现分布式爬虫

    将请求分散到多个IP地址上,可以使用分布式爬虫框架,如Scrapy-Cluster,来减少单个IP的负载。

    4. 减少请求频率

    减少对Google的请求频率。例如,可以限制每分钟的请求数量:

    import time
    
    REQUESTS_PER_MINUTE = 10
    start_time = time.time()
    
    for keyword in keywords:
        # Your search code here
        elapsed_time = time.time() - start_time
        if elapsed_time < 60:
            time.sleep(60 - elapsed_time)
        start_time = time.time()
    

    5. 模拟真实用户行为

    通过模拟真实用户的行为,可以增加爬虫的隐蔽性。包括随机滚动页面、点击链接等。

    6. 使用不同的搜索引擎

    可以尝试使用不同的搜索引擎来分担负载,例如Bing、Yahoo等。

    7. 使用Google Search API

    虽然有配额限制,但使用官方的Google Search API可以避免被屏蔽:

    from googleapiclient.discovery import build
    
    service = build("customsearch", "v1", developerKey="YOUR_API_KEY")
    res = service.cse().list(q='search query', cx='YOUR_SEARCH_ENGINE_ID').execute()
    print(res)
    

    8. 检查并处理异常情况

    确保正确处理异常情况,如重试机制、错误日志记录等。

    示例代码

    结合以上建议的代码示例:

    import requests
    from bs4 import BeautifulSoup
    import random
    import time
    
    def fetch_google_search_results(query):
        user_agents = [
            # List of user agents
        ]
        headers = {
            'User-Agent': random.choice(user_agents),
        }
        response = requests.get(f"https://www.google.com/search?q={query}", headers=headers)
        return response.text
    
    def parse_results(html):
        soup = BeautifulSoup(html, 'html.parser')
        # Parsing logic
        return results
    
    def main(keywords):
        for keyword in keywords:
            try:
                random_wait()
                html = fetch_google_search_results(keyword)
                results = parse_results(html)
                # Process results
            except Exception as e:
                print(f"Error fetching results for {keyword}: {e}")
                continue
    
    def random_wait():
        wait_time = random.randint(60, 120)
        time.sleep(wait_time)
    
    if __name__ == "__main__":
        keywords = ["example keyword1", "example keyword2"]
        main(keywords)
    

    9. 增加请求失败重试机制

    添加重试机制以应对请求失败的情况:

    import requests
    from requests.exceptions import RequestException
    import time
    
    def fetch_with_retry(url, headers, retries=3):
        for i in range(retries):
            try:
                response = requests.get(url, headers=headers)
                response.raise_for_status()
                return response.text
            except RequestException as e:
                print(f"Attempt {i + 1} failed: {e}")
                if i < retries - 1:
                    time.sleep(2 ** i)  # Exponential backoff
                else:
                    raise
    
    def fetch_google_search_results(query):
        user_agents = [
            # List of user agents
        ]
        headers = {
            'User-Agent': random.choice(user_agents),
        }
        return fetch_with_retry(f"https://www.google.com/search?q={query}", headers)
    

    通过结合以上方法,可以有效减少被Google屏蔽的可能性,提高爬虫的稳定性和可靠性。如果这些方法都无法解决问题,可能需要进一步分析具体的错误信息和情况。

    评论

报告相同问题?

问题事件

  • 系统已结题 8月16日
  • 修改了问题 8月8日
  • 创建了问题 8月8日