Python 网络爬虫入门详解

本文介绍了网络爬虫,它是按规则在网络上爬取内容的脚本程序。阐述了网络爬虫的组成结构,包括调度程序、URL管理器等。还详细说明了编写网络爬虫的步骤,如准备BeautifulSoup库,编写各组件代码等,最后提醒要根据网页变化修改代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是网络爬虫

 

       网络爬虫又称网络蜘蛛,是指按照某种规则在网络上爬取所需内容的脚本程序。众所周知,每个网页通常包含其他网页的入口,网络爬虫则通过一个网址依次进入其他网址获取所需内容。

优先申明:我们使用的python编译环境为PyCharm

 

一、首先一个网络爬虫的组成结构:

  • 爬虫调度程序(程序的入口,用于启动整个程序)
  • url管理器(用于管理未爬取得url及已经爬取过的url)
  • 网页下载器(用于下载网页内容用于分析)
  • 网页解析器(用于解析下载的网页,获取新的url和所需内容)
  • 网页输出器(用于把获取到的内容以文件的形式输出)

 

二、编写网络爬虫

(1)准备所需库

 我们需要准备一款名为BeautifulSoup(网页解析)的开源库,用于对下载的网页进行解析,我们是用的是PyCharm编译环境所以可以直接下载该开源库。

 

步骤如下:

选择File->Settings

 

打开Project:PythonProject下的Project interpreter

 

点击加号添加新的库

 

输入bs4选择bs4点击Install Packge进行下载

 

(2)编写爬虫调度程序

    这里的bike_spider是项目名称引入的四个类分别对应下面的四段代码url管理器,url下载器,url解析器,url输出器。


 
  1. # 爬虫调度程序
  2. from bike_spider import url_manager, html_downloader, html_parser, html_outputer
  3. # 爬虫初始化
  4. class SpiderMain(object):
  5. def __init__(self):
  6. self.urls = url_manager.UrlManager()
  7. self.downloader = html_downloader.HtmlDownloader()
  8. self.parser = html_parser.HtmlParser()
  9. self.outputer = html_outputer.HtmlOutputer()
  10. def craw(self, my_root_url):
  11. count = 1
  12. self.urls.add_new_url(my_root_url)
  13. while self.urls.has_new_url():
  14. try:
  15. new_url = self.urls.get_new_url()
  16. print( "craw %d : %s" % (count, new_url))
  17. # 下载网页
  18. html_cont = self.downloader.download(new_url)
  19. # 解析网页
  20. new_urls, new_data = self.parser.parse(new_url, html_cont)
  21. self.urls.add_new_urls(new_urls)
  22. # 网页输出器收集数据
  23. self.outputer.collect_data(new_data)
  24. if count == 10:
  25. break
  26. count += 1
  27. except:
  28. print( "craw failed")
  29. self.outputer.output_html()
  30. if __name__ == "__main__":
  31. root_url = "http://baike.baidu.com/item/Python/407313"
  32. obj_spider = SpiderMain()
  33. obj_spider.craw(root_url)

 

(3)编写url管理器

我们把已经爬取过的url和未爬取的url分开存放以便我们不会重复爬取某些已经爬取过的网页。


 
  1. # url管理器
  2. class UrlManager(object):
  3. def __init__(self):
  4. self.new_urls = set()
  5. self.old_urls = set()
  6. def add_new_url(self, url):
  7. if url is None:
  8. return
  9. if url not in self.new_urls and url not in self.old_urls:
  10. self.new_urls.add(url)
  11. def add_new_urls(self, urls):
  12. if urls is None or len(urls) == 0:
  13. return
  14. for url in urls:
  15. self.new_urls.add(url)
  16. def get_new_url(self):
  17. # pop方法会帮我们获取一个url并且移除它
  18. new_url = self.new_urls.pop()
  19. self.old_urls.add(new_url)
  20. return new_url
  21. def has_new_url(self):
  22. return len(self.new_urls) != 0

 

(4)编写网页下载器

通过网络请求来下载页面


 
  1. # 网页下载器
  2. import urllib.request
  3. class HtmlDownloader(object):
  4. def download(self, url):
  5. if url is None:
  6. return None
  7. response = urllib.request.urlopen(url)
  8. # code不为200则请求失败
  9. if response.getcode() != 200:
  10. return None
  11. return response.read()

 

(5)编写网页解析器

对网页进行解析时我们需要知道我们要查询的内容都有哪些特征,我们可以打开一个网页点击右键审查元素来了解我们所查内容的共同之处。


 
  1. # 网页解析器
  2. import re
  3. from bs4 import BeautifulSoup
  4. from urllib.parse import urljoin
  5. class HtmlParser(object):
  6. def parse(self, page_url, html_cont):
  7. if page_url is None or html_cont is None:
  8. return
  9. soup = BeautifulSoup(html_cont, "html.parser", from_encoding= "utf-8")
  10. new_urls = self._get_new_urls(page_url, soup)
  11. new_data = self._get_new_data(page_url, soup)
  12. return new_urls, new_data
  13. def _get_new_data(self, page_url, soup):
  14. res_data = { "url": page_url}
  15. # 获取标题
  16. title_node = soup.find( "dd", class_= "lemmaWgt-lemmaTitle-title").find( "h1")
  17. res_data[ "title"] = title_node.get_text()
  18. summary_node = soup.find( "div", class_= "lemma-summary")
  19. res_data[ "summary"] = summary_node.get_text()
  20. return res_data
  21. def _get_new_urls(self, page_url, soup):
  22. new_urls = set()
  23. # 查找出所有符合下列条件的url
  24. links = soup.find_all( "a", href=re.compile( r"/item/"))
  25. for link in links:
  26. new_url = link[ 'href']
  27. # 获取到的url不完整,学要拼接
  28. new_full_url = urljoin(page_url, new_url)
  29. new_urls.add(new_full_url)
  30. return new_urls

 

(6)编写网页输出器

输出的格式有很多种,我们选择以html的形式输出,这样我们可以的到一个html页面。


 
  1. # 网页输出器
  2. class HtmlOutputer(object):
  3. def __init__(self):
  4. self.datas = []
  5. def collect_data(self, data):
  6. if data is None:
  7. return
  8. self.datas.append(data)
  9. # 我们以html表格形式进行输出
  10. def output_html(self):
  11. fout = open( "output.html", "w", encoding= 'utf-8')
  12. fout.write( "<html>")
  13. fout.write( "<meta charset='utf-8'>")
  14. fout.write( "<body>")
  15. # 以表格输出
  16. fout.write( "<table>")
  17. for data in self.datas:
  18. # 一行
  19. fout.write( "<tr>")
  20. # 每个单元行的内容
  21. fout.write( "<td>%s</td>" % data[ "url"])
  22. fout.write( "<td>%s</td>" % data[ "title"])
  23. fout.write( "<td>%s</td>" % data[ "summary"])
  24. fout.write( "</tr>")
  25. fout.write( "</table>")
  26. fout.write( "</body>")
  27. fout.write( "</html>")
  28. # 输出完毕后一定要关闭输出器
  29. fout.close()

 

写在末尾

       注意:网页经常发生变化,我们需要根据网页的变化动态修改我们的代码来获得我们所需要的内容。

       这只是一个简单的网络爬虫,如果需要完善其功能我们需要考虑更多问题。

爬虫入门后可以看一下爬虫如何模拟登陆Python爬虫模拟登陆

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值