Press "Enter" to skip to content

掌握使用BeautifulSoup进行网页抓取

掌握使用BeautifulSoup进行网页抓取 四海 第1张

史蒂夫·乔布斯曾经说过:“计算机就像我们思维的自行车。”让我们一起踏上以ChatGPT为指南探索网络爬虫的风景之旅。

除了其他出色的用途外,ChatGPT可以成为您学习任何事物的指南和伴侣,包括网络爬虫。请记住,我们不仅谈论学习网络爬虫;我们谈论的是重新思考学习方式。

为了培养好奇心和编码的相互融合,准备好整理好的内容和解释的部分吧。让我们开始吧。

如何使用ChatGPT学习网络爬虫?

在这里,我们需要一个很好的计划。网络爬虫可以帮助您完成新颖的数据科学项目,吸引雇主的注意,并帮助您找到梦寐以求的工作。或者您甚至可以出售您抓取的数据。但在所有这些之前,您应该制定一个计划。让我们来探索一下我在说什么。

首先:制定一个计划

阿尔伯特·爱因斯坦曾经说过:“如果我有一个小时来解决一个问题,我会花55分钟思考问题,5分钟思考解决方案。” 在这个例子中,我们将遵循他的逻辑。

要学习网络爬虫,首先您应该确定使用哪个编码库。例如,如果您想要学习用于数据科学的Python,您应该将其拆分为以下几个部分:

  • 网络爬虫
  • 数据探索和分析
  • 数据可视化
  • 机器学习

像这样,在进行选择之前,我们可以将网络爬虫分成几个部分。我们还有很多时间可以利用。以下是网络爬虫的库:

  • Requests
  • Scrapy
  • BeautifulSoup
  • Selenium

太棒了,假设您选择了BeautifulSoup。我建议您准备一个出色的内容表。您可以从网络上找到一本书的内容表。假设您的内容表的前两个部分如下:

标题:掌握BeautifulSoup的网络爬虫

目录

第1节:网络爬虫基础

  • 介绍网络爬虫
  • 使用Python和BeautifulSoup入门
  • 理解HTML和DOM结构

第2节:环境设置和基本技巧

  • 设置您的网络爬虫环境
  • BeautifulSoup的基本技巧

另外,请不要搜索上述提到的电子书,因为我只是为了这个例子而创作的。

现在,您有了内容表。是时候遵循您的日常学习计划了。比如说,今天您想学习第1节。您可以使用以下提示:

扮演一个Python教师的角色,使用编码示例向我解释以下各个子部分。措辞要对话式,并适合九年级的水平;假设我完全是一个初学者。在每个子部分之后,询问我是否理解概念,以及是否有任何问题第1节:网络爬虫基础介绍网络爬虫使用Python和BeautifulSoup入门理解HTML和DOM结构”

掌握使用BeautifulSoup进行网页抓取 四海 第2张

这是ChatGPT输出的第一部分。它以初学者为目标解释概念,提供编码示例,并提出问题来检查您的理解,非常酷。让我们看看其余部分的回答。

掌握使用BeautifulSoup进行网页抓取 四海 第3张

很好,现在你对此有了一些了解。从这个示例中可以看出,它已经提供了关于Web抓取的有价值的信息。但是让我们探索一下它如何帮助你进行更高级的应用。

重要提示:谨慎对待ChatGPT的回答可能会存在不准确性。一定要在提供信息之后进行验证。

从上面的示例可以看出,一旦你有一个合理的计划,ChatGPT在学习Web抓取等概念方面非常有帮助。在本节中,我们将进一步探讨ChatGPT的其他应用,如调试或改进代码。

 

调试你的代码

 

有时候,调试可能非常困难且耗时,如果你没有编写正确的代码,可能会花费很多时间,就像下面的代码示例中所示。

在下面的代码中,我们旨在从网站上爬取经常使用的引语,而使用Python学习Web抓取,让我们来看看。

import requestsfrom bs4 import BeautifulSoupdef scrape_quotes():    page = 1    while True:        # 这个URL不会随着页面编号而变化,导致错误。        url = "https://quotes.toscrape.com/page/1/"        response = requests.get(url)        if response.ok:            soup = BeautifulSoup(response.text, 'html.parser')            quotes = soup.find_all('span', class_='text')            if quotes:                for quote in quotes:                    print(quote.text)            else:                # 这个条件永远不会为真,因为 'quotes' 不会为空。                print("没有更多的引语可供爬取。")                break            # 页面变量递增,但在URL中未使用。            page += 1        else:            print(f"无法获取网页,状态码: {response.status_code}")            breakscrape_quotes()

 

你能找出代码中的错误吗?如果不能,没关系;我想除了专家之外,很少有人能做到。

错误是一个经典案例,循环永远不会达到结束条件,所以在运行之前要小心或准备好手动停止它。

这个错误意味着尽管我们的页面变量增加了,但脚本仍然会请求相同的页面,使我们陷入无限循环。

在这里,你需要使用以下提示来调试你的代码。

调试这段代码。

 

然后,它将立即调试你的代码块并提供最新版本给你。

import requestsfrom bs4 import BeautifulSoupdef scrape_quotes():    page = 1    while True:        url = f"https://quotes.toscrape.com/page/{page}/"  # 现在URL会随着页面编号更新。        response = requests.get(url)        if response.ok:            soup = BeautifulSoup(response.text, 'html.parser')            quotes = soup.find_all('span', class_='text')            if quotes:                for quote in quotes:                    print(quote.text)            else:                print("没有更多的引语可供爬取。")                break            page += 1  # 增加页面编号。        else:            print(f"无法获取网页,状态码: {response.status_code}")            breakscrape_quotes()

 

输出将包含来自该网站的所有引语。

 

改进你的代码

 

假设你要从上面的网站爬取引语。

这是代码。

import requestsfrom bs4 import BeautifulSoupimport timedef scrape_quotes_longer():    page = 1    all_quotes = []    while True:        try:            response = requests.get(f"https://quotes.toscrape.com/page/{page}/", timeout=5)            if not response.ok:                break            soup = BeautifulSoup(response.text, 'html.parser')            quotes = soup.find_all('span', class_='text')            for quote in quotes:                all_quotes.append(quote.text)            # Naive check for the 'next' button            next_btn = soup.select_one('li.next > a')            if not next_btn:                break            page += 1            time.sleep(2)  # 在请求之间睡眠2秒钟        except requests.RequestException as e:            print(f"请求失败: {e}")            break    return all_quotesquotes = scrape_quotes_longer()for q in quotes:    print(q)

输出将与之前相同,所有引号都将存在,但假设您对代码不满意并希望改进您的代码。

您可以使用以下提示,它简单而强大。

改进此代码。

现在让我们看看ChatGPT提供的新代码。

import requestsfrom bs4 import BeautifulSoupfrom requests.exceptions import RequestExceptionfrom time import sleepdef scrape_quotes_improved():    page = 1    all_quotes = []    headers = {'User-Agent': 'Mozilla/5.0'}        while True:        url = f"https://quotes.toscrape.com/page/{page}/"        try:            response = requests.get(url, headers=headers, timeout=5)            response.raise_for_status()  # 如果HTTP请求返回失败状态代码,则引发HTTPError                        soup = BeautifulSoup(response.text, 'html.parser')            quotes = [quote.text for quote in soup.find_all('span', class_='text')]            if not quotes:                break            all_quotes.extend(quotes)                        next_btn = soup.select_one('li.next > a')            if not next_btn:                break  # 没有更多页面                        page += 1            sleep(1)  # 更合理的延迟        except RequestException as e:            print(f"请求失败:{e}")            break    return all_quotesquotes = scrape_quotes_improved()for q in quotes:    print(q)

输出将相同,但这里是ChatGPT所做的改进。

掌握使用BeautifulSoup进行网页抓取 四海 第4张

正如您所看到的,它真的很强大。

更高级的应用

掌握使用BeautifulSoup进行网页抓取 四海 第5张

在这里,您可以尝试通过下载要进行网页抓取的网页的HTML文件,并将HTML文档发送到ChatGPT高级数据分析中,从而自动化整个网页抓取过程。

让我们从一个例子中看看。这是IMDB的网站,其中包含根据IMDB用户评分的前100部电影,但在此网页末尾,不要忘记点击50个更多,以允许此网页显示所有100个。

之后,我们通过右键单击网页上的位置,然后单击另存为,并选择HTML文件来下载HTML文件。现在您已经获得了该文件,请打开ChatGPT并选择高级数据分析。

现在是时候首先将您下载的HTML文件添加到文件中了。在添加文件之后,使用下面的提示。

保存前100部IMDb电影,包括电影名称、IMDb评级,然后显示前五行。此外,将此数据框保存为CSV文件并将其发送给我。

但是,如果网页的结构有点复杂,ChatGPT可能无法完全理解您网站的结构。在这里,我建议您使用它的新功能,发送图片。您可以发送要收集信息的网页的屏幕截图。

要使用此功能,请右键单击网页,并单击检查,这里您可以看到HTML元素。

将此网页的屏幕截图发送到ChatGPT,并询问有关此网页元素的更多信息。一旦您获得了ChatGPT所需的这些更多信息,返回到先前的对话中,再次将这些信息发送给ChatGPT。然后,您就完成了!

掌握使用BeautifulSoup进行网页抓取 四海 第6张

最后的思考

我们通过ChatGPT发现了网页抓取。通过与AI一起规划、调试和优化代码,不仅高效生产,而且富有启发性。这是与技术对话,引领我们获得新的见解。

正如你所知,数据科学就像网络爬虫一样需要实践。就像手工艺一样。编写代码,纠正错误,然后重新编写——这是那些渴望在数据科学领域留下自己印记的初学者们的口头禅。

准备好动手体验了吗?StrataScratch平台就是你的竞技场。在其中参与数据项目,解答面试题,并加入一个将帮助你成长的社区。我们在那里见!

****[Nate Rosidi](https://twitter.com/StrataScratch)****是一名数据科学家和产品策略师。他还是一名兼职教授,教授分析学,并是StrataScratch的创始人,该平台通过提供来自顶级公司的真实面试问题来帮助数据科学家准备面试。请通过Twitter: StrataScratchLinkedIn与他联系。

Leave a Reply

Your email address will not be published. Required fields are marked *