【问题标题】:Can't get rid of a loop when certain conditions are met满足某些条件时无法摆脱循环
【发布时间】:2019-11-21 14:48:34
【问题描述】:

我在 python 中创建了一个脚本来获取来自 bing 的搜索结果的前 400 个链接。不确定是否总是至少有 400 个结果。在这种情况下,结果数约为 300。它的目标网页中有 10 个结果。但是,可以在遍历下一页时找到其余结果。问题是当那里没有更多的下一页链接时,网页会一遍又一遍地显示最后的结果。

搜索关键字是michael jackson,这是一个成熟的link

当没有更多新结果或结果小于 400 时,如何摆脱循环?`

我试过了:

import time
import requests
from bs4 import BeautifulSoup

link = "https://www.bing.com/search?"

params = {'q': 'michael jackson','first': ''}

def get_bing_results(url):
    q = 1
    while q<=400:
        params['first'] = q
        res = requests.get(url,params=params,headers={
            "User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36"
            })
        soup = BeautifulSoup(res.text,"lxml")
        for link in soup.select("#b_results h2 > a"):
            print(link.get("href"))

        time.sleep(2)
        q+=10

if __name__ == '__main__':
    get_bing_results(link)

【问题讨论】:

  • 你能跟踪页码吗?如果当前循环中的页码与上一个循环中的页码相同那么break?
  • 抱歉,下一个页码似乎是动态生成的,我无法使用请求进行跟踪。
  • BeautifulSoup 应该能够提取页码。还是应该在网址栏中对? (我以前没有这样做过)。
  • @MITHU,详细说明 2 个时刻:“新结果”和“网页一遍又一遍地显示最后的结果”——你如何区分那些“新”?
  • 你可以拿着之前的汤对象和新的比较,如果它们匹配你就可以摆脱厕所,如果它们不同,继续吗?

标签: python python-3.x web-scraping


【解决方案1】:

正如我在 cmets 中提到的,你不能这样做吗:

import time
import requests
from bs4 import BeautifulSoup

link = "https://www.bing.com/search?"

params = {'q': 'michael jackson','first': ''}

def get_bing_results(url):
    q = 1
    prev_soup = str()
    while q <= 400:
        params['first'] = q
        res = requests.get(url,params=params,headers={
            "User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36"
            })
        soup = BeautifulSoup(res.text,"lxml")
        if str(soup) != prev_soup:
            for link in soup.select("#b_results h2 > a"):
                print(link.get("href"))
            prev_soup = str(soup)
        else:
            break
        time.sleep(2)
        q+=10

if __name__ == '__main__':
    get_bing_results(link)

【讨论】:

  • 是的,我正在尝试您的答案。这就是我试图应用的逻辑,但在我看到你的想法之前我自己找不到任何想法。不过,我会让你知道我在做什么。
  • 我刚刚运行它,它似乎为我完成了这项工作,让我知道它是否适合你。
猜你喜欢
  • 2022-01-22
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多