news 2026/1/12 14:13:44

第三章——爬虫工具场景之Python爬虫实战:行业资讯爬取与存储,抢占信息先机

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第三章——爬虫工具场景之Python爬虫实战:行业资讯爬取与存储,抢占信息先机

在当今瞬息万变的商业环境和个人发展进程中,及时掌握行业资讯犹如握住开启成功之门的钥匙。对于企业而言,行业资讯是制定战略决策、把握市场趋势、洞察竞争对手动态的重要依据;对于个人来说,它有助于明确职业发展方向、提升自身竞争力。本部分将深入讲解如何利用Python实现行业资讯的爬取与存储,助力你在信息浪潮中抢占先机。

一、课程引入:及时获取行业资讯的重要性

在数字化时代,信息传播速度极快,行业动态瞬息万变。例如,科技行业的新兴技术突破可能瞬间改变市场格局,传统制造业的原材料价格波动会直接影响生产成本和产品定价。企业若能及时获取这些资讯,就能提前布局,调整生产策略、优化产品研发方向,在竞争中脱颖而出。对于个人,如求职者了解行业前沿趋势和人才需求变化,可针对性地提升技能,增加就业竞争力。因此,掌握快速获取行业资讯的方法迫在眉睫。

二、需求分析

我们的目标很明确,输入行业资讯网站的URL,通过编写爬虫程序,获取网站上的资讯内容,并将其存储起来,方便后续随时查阅和分析。无论是专业的行业资讯网站,还是综合新闻平台中的行业板块,都要能实现精准爬取与有效存储。

三、核心功能拆解

  1. 网页请求发送:向指定的行业资讯网站发送HTTP请求,这就像是向网站“敲门”,请求获取网页内容。
  2. 网页解析:将获取到的网页原始内容进行解析,把复杂的HTML代码转化为计算机易于理解和处理的结构,为后续提取数据做准备。
  3. 数据提取:从解析后的网页结构中,准确地定位并提取出我们关注的资讯标题、正文等关键内容。
  4. 数据存储:把提取到的资讯内容存储到文件(如CSV)或数据库中,实现数据的长期保存与便捷检索。

四、代码分步实现

导入requestsBeautifulSoup库,讲解库的功能

在Python爬虫开发中,requests库和BeautifulSoup库是两个强大的工具。

importrequestsfrombs4importBeautifulSoup
  • requests库:主要用于发送HTTP请求,获取网页内容。它提供了简洁易用的接口,可以轻松模拟浏览器发送各种类型的请求(如GET、POST等),并处理响应。例如,我们可以使用它获取网页的HTML文本、图片、文件等资源。
  • BeautifulSoup库:用于解析HTML或XML文档。它能够将复杂的网页结构转化为树形结构,方便我们通过各种选择器来定位和提取所需的数据。例如,通过标签名、类名、ID等方式找到特定的HTML元素,并获取其文本内容、属性值等。

发送HTTP请求获取网页内容,注释请求头设置意义

使用requests库发送HTTP GET请求获取网页内容。同时,合理设置请求头可以模拟浏览器行为,避免被网站识别为爬虫而拒绝访问。

url='https://example.com'# 替换为实际的行业资讯网站URLheaders={'User - Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}response=requests.get(url,headers=headers)ifresponse.status_code==200:html_content=response.textelse:print(f'请求失败,状态码:{response.status_code}')
  • url:指定要爬取的行业资讯网站的URL。
  • headers:设置请求头,其中User - Agent模拟了一个常见的浏览器标识。网站通常会根据User - Agent来判断请求是否来自真实浏览器。通过设置合理的User - Agent,可以增加爬虫的伪装性,降低被反爬机制拦截的风险。
  • requests.get(url, headers = headers):发送HTTP GET请求到指定的url,并带上设置的请求头headers
  • response.status_code:获取响应的状态码,200表示请求成功,其他状态码可能表示不同的错误情况。若请求成功,将网页的文本内容赋值给html_content

使用BeautifulSoup解析网页,讲解HTML结构分析

获取到网页内容后,使用BeautifulSoup进行解析。首先要了解HTML的基本结构,HTML文档由一系列的标签组成,如<html><head><body>等,标签可以嵌套形成树形结构。

soup=BeautifulSoup(html_content,'html.parser')

这里使用html.parser解析器来解析html_content,创建一个BeautifulSoup对象soupBeautifulSoup会将HTML内容解析成一个树形结构,我们可以通过遍历这个树形结构来定位和提取数据。例如,soup.body可以获取HTML文档的<body>部分,soup.find_all('a')可以找到所有的<a>标签(链接标签)。

定位并提取资讯标题、正文等内容,注释选择器使用方法

通过分析网页的HTML结构,使用BeautifulSoup的选择器来定位和提取资讯标题、正文等内容。假设资讯标题在<h1>标签中,正文在<div>标签且该div具有特定的类名article - content

# 提取标题title=soup.find('h1').textifsoup.find('h1')else'未找到标题'# 提取正文article_content=soup.find('div',class_='article - content')content=article_content.get_text()ifarticle_contentelse'未找到正文'
  • soup.find('h1'):使用find方法查找第一个<h1>标签,若找到则通过.text获取其文本内容作为标题;若未找到则返回“未找到标题”。
  • soup.find('div', class_='article - content'):使用find方法查找具有article - content类名的<div>标签,这是定位正文所在的标签。class_中的下划线是因为class是Python的关键字,所以在BeautifulSoup中使用class_来表示HTML中的class属性。若找到该标签,通过.get_text()获取其文本内容作为正文;若未找到则返回“未找到正文”。

将提取的数据存储到文件(如CSV)或数据库,讲解存储操作

存储到CSV文件

CSV(Comma - Separated Values)是一种常用的文件格式,用于存储表格数据。使用Python的csv模块可以方便地将数据存储为CSV文件。

importcsvwithopen('industry_news.csv','w',newline='',encoding='utf - 8')ascsvfile:fieldnames=['标题','正文']writer=csv.DictWriter(csvfile,fieldnames=fieldnames)writer.writeheader()writer.writerow({'标题':title,'正文':content})
  • open('industry_news.csv', 'w', newline='', encoding='utf - 8'):以写入模式打开一个名为industry_news.csv的文件,newline=''用于避免在Windows系统下写入CSV文件时出现额外的空行,encoding='utf - 8'指定文件编码为UTF - 8,以支持各种字符。
  • fieldnames定义了CSV文件的表头。
  • csv.DictWriter(csvfile, fieldnames = fieldnames)创建一个DictWriter对象,用于将字典形式的数据写入CSV文件。
  • writer.writeheader()写入表头。
  • writer.writerow({'标题': title, '正文': content})将提取到的标题和正文数据以字典形式写入CSV文件的一行。
存储到数据库(以SQLite为例)

SQLite是一种轻量级的数据库,适合小型项目和快速开发。首先需要导入sqlite3模块。

importsqlite3 conn=sqlite3.connect('industry_news.db')cursor=conn.cursor()cursor.execute('''CREATE TABLE IF NOT EXISTS news ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, content TEXT )''')cursor.execute("INSERT INTO news (title, content) VALUES (?,?)",(title,content))conn.commit()conn.close()
  • sqlite3.connect('industry_news.db'):连接到名为industry_news.db的SQLite数据库,如果数据库不存在则创建。
  • cursor.execute('''CREATE TABLE IF NOT EXISTS news...'''):创建一个名为news的表(如果不存在),表中包含id(自增主键)、title(标题)和content(正文)字段。
  • cursor.execute("INSERT INTO news (title, content) VALUES (?,?)", (title, content)):将提取到的标题和正文数据插入到news表中。
  • conn.commit():提交事务,确保数据插入操作生效。
  • conn.close():关闭数据库连接。

五、优化迭代:提高爬取效率,处理动态加载网页

提高爬取效率

为提高爬取效率,可以采用多线程或异步编程方式。例如,使用concurrent.futures模块实现多线程爬取多个网页。假设有一个包含多个URL的列表urls

importconcurrent.futuresdefcrawl(url):headers={'User - Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}response=requests.get(url,headers=headers)ifresponse.status_code==200:html_content=response.text soup=BeautifulSoup(html_content,'html.parser')title=soup.find('h1').textifsoup.find('h1')else'未找到标题'article_content=soup.find('div',class_='article - content')content=article_content.get_text()ifarticle_contentelse'未找到正文'return{'标题':title,'正文':content}else:return{'标题':f'请求失败,状态码:{response.status_code}','正文':''}withconcurrent.futures.ThreadPoolExecutor()asexecutor:results=list(executor.map(crawl,urls))forresultinresults:print(result)

上述代码定义了一个crawl函数用于爬取单个URL的内容,通过ThreadPoolExecutor创建线程池,使用executor.map方法并行调用crawl函数处理多个URL,从而提高爬取效率。

处理动态加载网页

许多现代网站采用动态加载技术,即部分内容通过JavaScript在页面加载后异步获取。对于这类网页,可以使用Selenium库结合浏览器驱动(如ChromeDriver)来模拟浏览器行为,等待页面动态内容加载完成后再进行数据提取。

fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasEC driver=webdriver.Chrome()driver.get(url)try:element=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CLASS_NAME,'article - content')))html_content=driver.page_source soup=BeautifulSoup(html_content,'html.parser')title=soup.find('h1').textifsoup.find('h1')else'未找到标题'content=soup.find('div',class_='article - content').get_text()ifsoup.find('div',class_='article - content')else'未找到正文'finally:driver.quit()

上述代码使用Selenium打开指定的URL,通过WebDriverWait等待具有article - content类名的元素出现(最多等待10秒),这确保了动态内容已加载完成。然后获取页面源代码,使用BeautifulSoup进行解析和数据提取,最后关闭浏览器驱动。

六、部署测试:定期运行爬虫测试数据更新情况

将爬虫程序部署到服务器上(如阿里云、腾讯云等),可以使用crontab(Linux系统)或任务计划程序(Windows系统)来定期运行爬虫。例如,在Linux系统中,使用以下命令编辑crontab文件,设置每天凌晨2点运行爬虫:

0 2 * * * python /path/to/your/crawler.py

每次运行爬虫后,检查存储的数据文件或数据库,查看是否成功获取到新的行业资讯,对比新旧数据,确保数据的更新情况符合预期。同时,记录爬虫运行过程中的日志信息,方便排查可能出现的问题。

七、问题排查:解决反爬机制应对(如IP封禁、验证码处理)、网页结构变化导致的提取失败问题

应对反爬机制

  1. IP封禁:如果IP被封禁,可以采用IP代理池的方式。收集一些免费或付费的代理IP,在每次请求时随机选择一个代理IP。例如,使用requests库结合proxies参数设置代理:
proxies={'http':'http://your_proxy_ip:port','https':'https://your_proxy_ip:port'}response=requests.get(url,headers=headers,proxies=proxies)
  1. 验证码处理:对于简单的验证码(如数字验证码),可以使用pytesseract库结合PIL(Python Imaging Library)进行识别。首先安装相关库:
pip install pytesseract pillow

假设验证码图片的元素ID为captcha - img,可以使用以下代码获取并识别验证码:

fromseleniumimportwebdriverfromPILimportImageimportpytesseract driver=webdriver.Chrome()driver.get(url)captcha_image=driver.find_element(By.ID,'captcha - img')captcha_image.screenshot('captcha.png')image=Image.open('captcha.png')captcha_text=pytesseract.image_to_string(image)print(captcha_text)

对于复杂的验证码(如滑块验证码、拼图验证码等),可能需要使用第三方打码平台(如超级鹰)来识别。

网页结构变化

网页结构变化是爬虫面临的常见问题。可以定期检查网页结构,当发现提取失败时,重新分析网页的HTML结构,更新选择器。同时,可以使用版本控制系统(如Git)来记录爬虫代码的变化,便于回溯和管理。

完整举例代码

以下是一个完整的示例代码,整合了上述所有功能,包括基本的爬取、存储、多线程优化以及简单的反爬处理(设置请求头和使用代理):

importrequestsfrombs4importBeautifulSoupimportcsvimportsqlite3importconcurrent.futuresimportrandomdefcrawl(url,proxy=None):headers={'User - Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}try:ifproxy:response=requests.get(url,headers=headers,proxies=proxy)else:response=requests.get(url,headers=headers)ifresponse.status_code==200:html_content=response.text soup=BeautifulSoup(html_content,'html.parser')title=soup.find('h1').textifsoup.find('h1')else'未找到标题'article_content=soup.find('div',class_='article - content')content=article_content.get_text()ifarticle_contentelse'未找到正文'return{'标题':title,'正文':content}else:return{'标题':f'请求失败,状态码:{response.status_code}','正文':''}exceptExceptionase:return{'标题':f'发生错误:{str(e)}','正文':''}defsave_to_csv(data,filename='industry_news.csv'):withopen(filename,'w',newline='',encoding='utf - 8')ascsvfile:fieldnames=['标题','正文']writer=csv.DictWriter(csvfile,fieldnames=fieldnames)writer.writeheader()foritemindata:writer.writerow(item)defsave_to_sqlite(data,db_name='industry_news.db'):conn=sqlite3.connect(db_name)cursor=conn.cursor()cursor.execute('''CREATE TABLE IF NOT EXISTS news ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, content TEXT )''')foritemindata:cursor.execute("INSERT INTO news (title, content) VALUES (?,?)",(item['标题'],item['正文']))conn.commit()conn.close()if__name__=='__main__':urls=['https://example1.com','https://example2.com']# 替换为实际的URL列表proxies=[{'http':'http://proxy1_ip:port','https':'https://proxy1_ip:port'},{'http':'http://proxy2_ip:port','https':'https://proxy2_ip:port'}]withconcurrentif__name__=='__main__':urls=['https://example1.com','https://example2.com']# 替换为实际的URL列表proxies=[{'http':'http://proxy1_ip:port','https':'https://proxy1_ip:port'},{'http':'http://proxy2_ip:port','https':'https://proxy2_ip:port'}]withconcurrent.futures.ThreadPoolExecutor()asexecutor:results=list(executor.map(lambdau:crawl(u,random.choice(proxies)ifproxieselseNone),urls))save_to_csv(results)save_to_sqlite(results)

代码说明

  1. crawl函数:负责发送HTTP请求,获取网页内容并解析提取标题和正文。如果提供了代理,就使用代理发送请求,在请求成功时返回提取的数据,失败或出错时返回错误信息。
  2. save_to_csv函数:将爬取到的数据保存为CSV文件,文件名为industry_news.csv,并设置合适的编码和表头。
  3. save_to_sqlite函数:把数据保存到SQLite数据库industry_news.db中,若数据库不存在则创建,并创建名为news的表用于存储标题和正文。
  4. 主程序部分:定义了一个URL列表,代表要爬取的多个行业资讯网页地址。同时定义了一个代理列表(这里只是示例,需替换为真实有效的代理)。通过线程池并发调用crawl函数爬取每个URL的内容,随机选择代理进行请求。最后,将爬取结果分别保存到CSV文件和SQLite数据库中。

通过以上完整的代码示例,你可以更直观地看到如何将行业资讯爬取与存储的各个功能整合在一起,实现一个较为完整的爬虫程序。当然,在实际应用中,你需要根据具体的网站结构和反爬机制对代码进行调整和优化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/4 21:14:17

7、远程服务安全攻防全解析

远程服务安全攻防全解析 一、服务识别与基础脚本 1.1 脚本执行与服务识别 在网络安全的探索中,我们常常需要借助特定的脚本来进行服务识别。例如,有一个名为 wrapper - grab.bash 的脚本,它能够针对 hosts.txt 文件中列出的主机执行原始脚本 grab.bash 。 hosts.t…

作者头像 李华
网站建设 2026/1/8 2:17:54

18、网络安全防护:psad与fwsnort的应用与集成

网络安全防护:psad与fwsnort的应用与集成 一、psad应对网络攻击的机制 1.1 FIN扫描响应 当攻击者确认目标运行着可访问的TCP服务器后,可能会测试主动响应软件对TCP的严格程度,例如发送盲FIN数据包。使用Nmap进行FIN扫描时: [ext_scanner]# nmap -sF -P0 -p 80 -n 71.1…

作者头像 李华
网站建设 2026/1/11 19:38:42

30、深入探索fwknop:安全访问与防护机制详解

深入探索fwknop:安全访问与防护机制详解 1. fwknop基础功能与iptables配置 fwknop服务器可对iptables进行重新配置,以允许在30秒内访问SSHD服务。之后,fwknopd会从FWKNOP_INPUT链中删除ACCEPT规则。即便多数SSH连接时长超过30秒,但只要启用Netfilter连接跟踪功能,就能保…

作者头像 李华
网站建设 2026/1/4 22:27:43

31、编程技巧与实用程序解析

编程技巧与实用程序解析 在编程领域,有许多实用的技巧和程序可以帮助我们更高效地完成任务。本文将介绍一些常见的编程技巧和实用程序,包括文件处理、流编辑、库函数使用以及寻找变位词等方面。 1. 文件处理与输出重定向 在编程中,文件处理是一项常见的任务。有时候我们需…

作者头像 李华
网站建设 2026/1/9 4:03:19

38、深入探索 gawk 扩展开发:性能优化与功能定制

深入探索 gawk 扩展开发:性能优化与功能定制 1. 变量访问性能优化 在 gawk 中,每次访问和修改变量时,会有性能损耗,因为 gawk 必须每次都查找变量。这并非只是理论问题,而是实际存在的性能瓶颈。 为了解决这个问题,如果你的扩展需要花费大量时间读取和/或修改变量的值,…

作者头像 李华
网站建设 2026/1/9 14:52:47

数据结构之递归-如何巧妙利用递归函数的返回值

下面以一个例题为例进行阐述。给定一棵二叉树&#xff0c;返回所有表示从根结点到叶子结点路径的字符串。解析&#xff1a;该过程用递归实现更好理解和处理&#xff0c;要得到由1为根&#xff0c;5和3为叶子节点的所有路径组成的字符串&#xff0c;我们只需要用1->拼接上其左…

作者头像 李华