当前位置:首页 > 科技  > 软件

五分钟上手Python爬虫:从干饭开始,轻松掌握技巧

来源: 责编: 时间:2024-03-22 08:56:50 162观看
导读很多人都听说过爬虫,我也不例外。曾看到别人编写的爬虫代码,虽然没有深入研究,但感觉非常强大。因此,今天我决定从零开始,花费仅5分钟学习入门爬虫技术,以后只需轻轻一爬就能查看所有感兴趣的网站内容。广告?不存在的,因为我
很多人都听说过爬虫,我也不例外。曾看到别人编写的爬虫代码,虽然没有深入研究,但感觉非常强大。因此,今天我决定从零开始,花费仅5分钟学习入门爬虫技术,以后只需轻轻一爬就能查看所有感兴趣的网站内容。广告?不存在的,因为我看不见。爬虫只会获取我感兴趣的信息,不需要的内容对我而言只是一堆代码。我们不在乎网站的界面,爬取完数据后只会关注最核心的内容。

在这个过程中,技术方面实际上没有太多复杂的内容,实际上就是一项耐心细致的工作。因此才会有那么多人选择从事爬虫兼职工作,因为虽然耗时较长,但技术要求并不是很高。今天学完之后,你就不会像我一样认为爬虫很困难了。或许在未来你会需要考虑如何保持会话(session)或者绕过验证等问题,因为网站越难爬取,说明对方并不希望被爬取。实际上,这部分内容是最具挑战性的,有机会的话我们可以在以后的学习中深入讨论。Rqt28资讯网——每日最新资讯28at.com

今天我们以选择菜谱为案例,来解决我们在吃饭时所面临的“吃什么”的生活难题。Rqt28资讯网——每日最新资讯28at.com

爬虫解析

爬虫的工作原理类似于模拟用户在浏览网站时的操作:首先访问官方网站,检查是否有需要点击的链接,若有,则继续点击查看。当直接发现所需的图片或文字时,即可进行下载或复制。这种爬虫的基本架构如图所示,希望这样的描述能帮助你更好地理解。Rqt28资讯网——每日最新资讯28at.com

图片imageRqt28资讯网——每日最新资讯28at.com

爬网页HTML

在进行爬虫工作时,我们通常从第一步开始,即发送一个HTTP请求以获取返回的数据。在我们的工作中,通常会请求一个链接以获取JSON格式的信息,以便进行业务处理。然而,爬虫的工作方式略有不同,因为我们需要首先获取网页内容,因此这一步通常返回的是HTML页面。在Python中,有许多请求库可供选择,我只举一个例子作为参考,但你可以根据实际需求选择其他第三方库,只要能够完成任务即可。Rqt28资讯网——每日最新资讯28at.com

在开始爬虫工作之前,首先需要安装所需的第三方库依赖。这部分很简单,只需根据需要安装相应的库即可,没有太多复杂的步骤。Rqt28资讯网——每日最新资讯28at.com

让我们不多废话,直接看下面的代码示例:Rqt28资讯网——每日最新资讯28at.com

from urllib.request import urlopen,Requestheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0'}req = Request("https://www.meishij.net/?from=space_block",headers=headers)# 发出请求,获取html# 获取的html内容是字节,将其转化为字符串html = urlopen(req)html_text = bytes.decode(html.read())print(html_text)

通常情况下,我们可以获取这个菜谱网页的完整内容,就像我们在浏览器中按下F12查看的网页源代码一样。Rqt28资讯网——每日最新资讯28at.com

解析元素

最笨的方法是使用字符串解析,但由于Python有许多第三方库可以解决这个问题,因此我们可以使用BeautifulSoup来解析HTML。其他更多的解析方法就不一一介绍了,我们需要用到什么就去搜索即可,不需要经常使用的也没必要死记硬背。Rqt28资讯网——每日最新资讯28at.com

热搜菜谱

在这里,让我们对热门搜索中的菜谱进行解析和分析。Rqt28资讯网——每日最新资讯28at.com

from urllib.request import urlopen,Requestfrom bs4 import BeautifulSoup as bfheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0'}req = Request("https://www.meishij.net/?from=space_block",headers=headers)# 发出请求,获取html# 获取的html内容是字节,将其转化为字符串html = urlopen(req)html_text = bytes.decode(html.read())# print(html_text) # 用BeautifulSoup解析htmlobj = bf(html_text,'html.parser')# print(html_text)# 使用find_all函数获取所有图片的信息index_hotlist = obj.find_all('a',class_='sancan_item')# 分别打印每个图片的信息for ul in index_hotlist:    for li in ul.find_all('strong',class_='title'):        print(li.get_text())

主要步骤是,首先在上一步中打印出HTML页面,然后通过肉眼观察确定所需内容位于哪个元素下,接着利用BeautifulSoup定位该元素并提取出所需信息。在我的情况下,我提取的是文字内容,因此成功提取了所有li列表元素。Rqt28资讯网——每日最新资讯28at.com

随机干饭

在生活中,实际上干饭并不复杂,难点在于选择吃什么。因此,我们可以将所有菜谱解析并存储在一个列表中,然后让程序随机选择菜谱。这样,就能更轻松地解决每顿饭吃什么的难题了。Rqt28资讯网——每日最新资讯28at.com

随机选取一道菜时,可以使用以下示例代码:Rqt28资讯网——每日最新资讯28at.com

from urllib.request import urlopen,Requestfrom bs4 import BeautifulSoup as bffor i in range(3):    url = f"https://www.meishij.net/chufang/diy/jiangchangcaipu/?&page={i}"    html = urlopen(url)    # 获取的html内容是字节,将其转化为字符串    html_text = bytes.decode(html.read())    # print(html_text)    obj = bf(html_text,'html.parser')    index_hotlist = obj.find_all('img')    for p in index_hotlist:        if p.get('alt'):            print(p.get('alt'))

这里我们在这个网站上找到了新的链接地址,我已经获取了前三页的数据,并进行了随机选择,你可以选择全部获取。Rqt28资讯网——每日最新资讯28at.com

菜谱教程

其实上一步已经完成了,接下来只需下单外卖了。外卖种类繁多,但对于像我这样的顾家奶爸来说并不合适,因此我必须自己动手做饭。这时候教程就显得尤为重要了。Rqt28资讯网——每日最新资讯28at.com

我们现在继续深入解析教程内容:Rqt28资讯网——每日最新资讯28at.com

from urllib.request import urlopen,Requestimport urllib,stringfrom bs4 import BeautifulSoup as bfurl = f"https://so.meishij.net/index.php?q=红烧排骨"url = urllib.parse.quote(url, safe=string.printable)html = urlopen(url)# 获取的html内容是字节,将其转化为字符串html_text = bytes.decode(html.read())obj = bf(html_text,'html.parser')index_hotlist = obj.find_all('a',class_='img')# 分别打印每个图片的信息url = index_hotlist[0].get('href')html = urlopen(url)html_text = bytes.decode(html.read())obj = bf(html_text,'html.parser')index_hotlist = obj.find_all('div',class_='step_content')for div in index_hotlist:    for p in div.find_all('p'):        print(p.get_text())

包装一下

上面提到的方法已经满足了我们的需求,但是重复手动执行每个步骤并不是一个高效的方式。因此,我将这些步骤封装成一个简单的应用程序。这个应用程序使用控制台作为用户界面,不需要依赖任何第三方库。让我们一起来看一下这个应用程序吧:Rqt28资讯网——每日最新资讯28at.com

# 导入urllib库的urlopen函数from urllib.request import urlopen,Requestimport urllib,string# 导入BeautifulSoupfrom bs4 import BeautifulSoup as bffrom random import choice,samplefrom colorama import initfrom os import systemfrom termcolor import coloredfrom readchar import  readkeyFGS = ['green', 'yellow', 'blue', 'cyan', 'magenta', 'red']print(colored('搜索食谱中.....',choice(FGS)))headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0'}req = Request("https://www.meishij.net/?from=space_block",headers=headers)# 发出请求,获取html# 获取的html内容是字节,将其转化为字符串html = urlopen(req)html_text = bytes.decode(html.read())hot_list = []all_food = []food_page = 3# '/n'.join(pos(y, OFFSET[1]) + ' '.join(color(i) for i in l)def draw_menu(menu_list):    clear()    for idx,i in enumerate(menu_list):        print(colored(f'{idx}:{i}',choice(FGS)))    print(colored('8:随机选择',choice(FGS)))def draw_word(word_list):    clear()    for i in word_list:        print(colored(i,choice(FGS)))def clear():    system("CLS")def hot_list_func() :    global html_text    # 用BeautifulSoup解析html    obj = bf(html_text,'html.parser')    # print(html_text)    # 使用find_all函数获取所有图片的信息    index_hotlist = obj.find_all('a',class_='sancan_item')    # 分别打印每个图片的信息    for ul in index_hotlist:        for li in ul.find_all('strong',class_='title'):            hot_list.append(li.get_text())            # print(li.get_text())def search_food_detail(food) :    print('正在搜索详细教程,请稍等30秒左右!')    url = f"https://so.meishij.net/index.php?q={food}"    # print(url)    url = urllib.parse.quote(url, safe=string.printable)    html = urlopen(url)    # 获取的html内容是字节,将其转化为字符串    html_text = bytes.decode(html.read())    obj = bf(html_text,'html.parser')    index_hotlist = obj.find_all('a',class_='img')    # 分别打印每个图片的信息    url = index_hotlist[0].get('href')    # print(url)    html = urlopen(url)    html_text = bytes.decode(html.read())    # print(html_text)    obj = bf(html_text,'html.parser')    random_color = choice(FGS)    print(colored(f"{food}做法:",random_color))    index_hotlist = obj.find_all('div',class_='step_content')    # print(index_hotlist)    random_color = choice(FGS)    for div in index_hotlist:        for p in div.find_all('p'):            print(colored(p.get_text(),random_color))def get_random_food():    global food_page    if not all_food :        for i in range(food_page):            url = f"https://www.meishij.net/chufang/diy/jiangchangcaipu/?&page={i}"            html = urlopen(url)            # 获取的html内容是字节,将其转化为字符串            html_text = bytes.decode(html.read())            # print(html_text)            obj = bf(html_text,'html.parser')            index_hotlist = obj.find_all('img')            for p in index_hotlist:                if p.get('alt'):                    all_food.append(p.get('alt'))    my_food = choice(all_food)    print(colored(f'随机选择,今天吃:{my_food}',choice(FGS)))    return my_foodinit() ## 命令行输出彩色文字hot_list_func()print(colored('已搜索完毕!',choice(FGS)))my_array = list(range(0, 9))my_key = ['q','c','d','m']my_key.extend(my_array)print(colored('m:代表今日菜谱',choice(FGS)))print(colored('c:代表清空控制台',choice(FGS)))print(colored('d:代表菜谱教程',choice(FGS)))print(colored('q:退出菜谱',choice(FGS)))print(colored('0~8:选择菜谱中的菜',choice(FGS)))while True:    while True:        move = readkey()        if move in my_key or (move.isdigit() and int(move) <= len(random_food)):            break    if move == 'q': ## 键盘‘Q’是退出        break    if move == 'c': ## 键盘‘C’是清空控制台        clear()    if move == 'm':        random_food = sample(hot_list,8)        draw_menu(random_food)    if move.isdigit() and int(move) <= len(random_food):        if int(move) == 8:            my_food = get_random_food()        else:            my_food = random_food[int(move)]        print(my_food)    if move == 'd' and my_food : ## 键盘‘D’是查看教程        search_food_detail(my_food)        my_food = ''

完成一个简单的小爬虫其实并不复杂,如果不考虑额外的封装步骤,仅需5分钟即可完成,这已经足够快速让你入门爬虫技术。开始爬取某个网站的数据实际上是一项细致的工作。只需在网上搜索相关技术信息,找到适合的方法即可,如果有效就继续使用,不行就试试其他方法。Rqt28资讯网——每日最新资讯28at.com

总结

本文的重点在于引导读者如何初步掌握爬虫技术。初步掌握爬虫技术并不难,但是在实际操作中可能会遇到一些困难,比如一些网站不允许直接访问,需要登录或者进行各种人机验证等。因此,最好先从爬取一些新闻资讯类的网站开始,因为这样相对容易。涉及用户支付等敏感信息的网站就不那么容易获取了。因此,在入门阶段,建议不要纠结于选择一个复杂的网站,先尝试入门即可。一旦理解了基本原理,遇到问题时就可以考虑添加组件或者使用第三方库来解决。Rqt28资讯网——每日最新资讯28at.com


Rqt28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-78510-0.html五分钟上手Python爬虫:从干饭开始,轻松掌握技巧

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Extract 工具类型八个使用技巧

下一篇: 解锁正则表达式的秘密:regex-vis工具带你看见模式匹配的魔法!

标签:
  • 热门焦点
  • Rust中的高吞吐量流处理

    Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 2023 年的 Node.js 生态系统

    2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 一篇文章带你了解 CSS 属性选择器

    一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • JVM优化:实战OutOfMemoryError异常

    JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 华为HarmonyOS 4升级计划公布:首批34款机型今日开启公测

    华为HarmonyOS 4升级计划公布:首批34款机型今日开启公测

    8月4日消息,今天下午华为正式发布了HarmonyOS 4系统,在更流畅的前提下,还带来了不少新功能,UI设计也有变化,会让手机焕然一新。华为宣布,首批机型将会在
  •  三星推出Galaxy Tab S9系列平板电脑以及Galaxy Watch6系列智能手表

    三星推出Galaxy Tab S9系列平板电脑以及Galaxy Watch6系列智能手表

    2023年7月26日,三星电子正式发布了Galaxy Z Flip5与Galaxy Z Fold5。除此之外,Galaxy Tab S9系列平板电脑以及三星Galaxy Watch6系列智能手表也同期
  • 超级标准版旗舰!iQOO 11S全球首发iQOO超算独显芯片

    超级标准版旗舰!iQOO 11S全球首发iQOO超算独显芯片

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
  • 回归OPPO两年,一加赢了销量,输了品牌

    回归OPPO两年,一加赢了销量,输了品牌

    成为OPPO旗下主打性能的先锋品牌后,一加屡创佳绩。今年618期间,一加手机全渠道销量同比增长362%,凭借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
Top