写在前面

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

优先申明:我们使用的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输出器。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
# 爬虫调度程序from bike_spider import url_manager, html_downloader, html_parser, html_outputer# 爬虫初始化class SpiderMain(object):def __init__(self):self.urls = url_manager.UrlManager()self.downloader = html_downloader.HtmlDownloader()self.parser = html_parser.HtmlParser()self.outputer = html_outputer.HtmlOutputer()def craw(self, my_root_url):count = 1self.urls.add_new_url(my_root_url)while self.urls.has_new_url():try:new_url = self.urls.get_new_url()print("craw %d : %s" % (count, new_url))# 下载网页html_cont = self.downloader.download(new_url)# 解析网页new_urls, new_data = self.parser.parse(new_url, html_cont)self.urls.add_new_urls(new_urls)# 网页输出器收集数据self.outputer.collect_data(new_data)if count == 10:breakcount += 1except:print("craw failed")self.outputer.output_html()if __name__ == "__main__":root_url = "http://baike.baidu.com/item/Python/407313"obj_spider = SpiderMain()obj_spider.craw(root_url)

(3)编写url管理器

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
# url管理器class UrlManager(object):def __init__(self):self.new_urls = set()self.old_urls = set()def add_new_url(self, url):if url is None:returnif url not in self.new_urls and url not in self.old_urls:self.new_urls.add(url)def add_new_urls(self, urls):if urls is None or len(urls) == 0:returnfor url in urls:self.new_urls.add(url)def get_new_url(self):# pop方法会帮我们获取一个url并且移除它new_url = self.new_urls.pop()self.old_urls.add(new_url)return new_urldef has_new_url(self):return len(self.new_urls) != 0

(4)编写网页下载器

通过网络请求来下载页面

# 网页下载器import urllib.requestclass HtmlDownloader(object):def download(self, url):if url is None:return Noneresponse = urllib.request.urlopen(url)# code不为200则请求失败if response.getcode() != 200:return Nonereturn response.read()

(5)编写网页解析器

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
# 网页解析器import refrom bs4 import BeautifulSoupfrom urllib.parse import urljoinclass HtmlParser(object):def parse(self, page_url, html_cont):if page_url is None or html_cont is None:returnsoup = BeautifulSoup(html_cont, "html.parser", from_encoding="utf-8")new_urls = self._get_new_urls(page_url, soup)new_data = self._get_new_data(page_url, soup)return new_urls, new_datadef _get_new_data(self, page_url, soup):res_data = {"url": page_url}# 获取标题title_node = soup.find("dd", class_="lemmaWgt-lemmaTitle-title").find("h1")res_data["title"] = title_node.get_text()summary_node = soup.find("div", class_="lemma-summary")res_data["summary"] = summary_node.get_text()return res_datadef _get_new_urls(self, page_url, soup):new_urls = set()# 查找出所有符合下列条件的urllinks = soup.find_all("a", href=re.compile(r"/item/"))for link in links:new_url = link['href']# 获取到的url不完整,学要拼接new_full_url = urljoin(page_url, new_url)new_urls.add(new_full_url)return new_urls

(6)编写网页输出器

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

# 网页输出器class HtmlOutputer(object):def __init__(self):self.datas = []def collect_data(self, data):if data is None:returnself.datas.append(data)# 我们以html表格形式进行输出def output_html(self):fout = open("output.html", "w", encoding='utf-8')fout.write("<html>")fout.write("<meta charset='utf-8'>")fout.write("<body>")# 以表格输出fout.write("<table>")for data in self.datas:# 一行fout.write("<tr>")# 每个单元行的内容fout.write("<td>%s</td>" % data["url"])fout.write("<td>%s</td>" % data["title"])fout.write("<td>%s</td>" % data["summary"])fout.write("</tr>")fout.write("</table>")fout.write("</body>")fout.write("</html>")# 输出完毕后一定要关闭输出器fout.close()

写在最后

对于爬虫的学习,小编建议大家还是多动手敲代码,这样不仅可以更好的理解,而且在敲代码的过程中,遇到BUG时可以加深自己对于代码的理解!

Python爬虫不会?戳一下,小编一步步教你写一个简单的爬虫相关推荐

  1. 用python写一个简单的爬虫_Python实现简易Web爬虫详解

    编辑推荐: 本文主要介绍了Python实现简易Web爬虫详解,希望对大家有帮助. 本文来自于脚本之家 ,由火龙果软件Alice编辑,推荐. 简介: 网络爬虫(又被称为网页蜘蛛),网络机器人,是一种按照 ...

  2. 用python写一个简单的爬虫_用Python编写一个简单的爬虫

    作者信息: Author : 黄志成(小黄) 博客地址: 博客 呐,这是一篇福利教程.为什么这么说呢.我们要爬取的内容是美图网站(嘿嘿,老司机都懂的) 废话不多说.开始今天的表演. 这个图集网站不要问 ...

  3. 用python写一个简单的爬虫保存在json文件中

    学习python没多久,所以只能写一个很简单的爬虫啦~~ 我使用annacada 自带的spyder来写爬虫的,这次我们要爬取得网站是http://www.drugbank.ca/drugs, 主要是 ...

  4. 写一个简单的爬虫来批量爬取新浪网的新闻

    如标题,学习爬虫也有一段时间了,今天来爬取一下新浪网的新闻(其实之前自己爬过,但是隔了好久发现新浪网的网页结构有一些变化导致之前的爬虫失效了,这两天进行了一下代码更新),话不多说,进入正题. 工具:A ...

  5. 【教程】教你写一个简单的微信小黄鸡

    本文仅供技术交流,如果侵犯到了任何组织或个人的权益,请在本文留言,主页君会妥善处理. 前段时间人人网上的小黄鸡着实火了一把,而最近微信收费风波又炒得沸沸扬扬.主页君凑热闹写一篇教程:如何在微信公众平台 ...

  6. python写一个简单的爬虫程序(爬取快手)(附源码)

    快手是一个有意思的视频应用,但是它有一些视频不让下载,我们今天就用爬虫来实现爬取不让下载的视频: 首先右键点击检查,我们可以看见找到了视频的src,访问这个src就可以得到视频的下载网址,如下: 右键 ...

  7. 用python写一个简单的爬虫_用Python从零开始写一个简单爬虫

    import requests from bs4 import BeautifulSoup url = "https://tieba.baidu.com/f?kw=王者荣耀&fr=h ...

  8. 随笔写一个简单的爬虫

    目标:爬取damai网上即将上演的信息 1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 import requests, re 5 from bs4 ...

  9. 写一个简单的爬虫 - 如何模拟登录网站

    设置Developer Tools 以查看完整的登录过程 如 chrome 的 Developer Tools.firefox 的 httpfox 插件等 推荐 chrome 的 Developer ...

最新文章

  1. Docker运行sonarqube-(代码质量检测平台)
  2. linux top 报错 TERM environment variable not set.
  3. Electron中与Vue集成流程
  4. opencv vs2010 配置
  5. Scrapy - Request 和 Response(请求和响应)
  6. matlab的fftn,matlab fftn
  7. 保险条款精解(二) 丢车——如何将损失降到最低点?
  8. 联想小新pro无法人脸识别自动开机的解决方法
  9. 上周热点回顾(10.8-10.14)
  10. 编译安装PHP出现Cannot load /usr/local/apache/modules/libphp5.so
  11. 2016年PMP项目管理知识体系精髓总结
  12. Process Explorer 进程管理利器常用功能(中)
  13. Arcgis(AE)二次开发问题解决 创建组件”ToolbarControl”失败等
  14. 物流管理毕业论文题目【510个】
  15. 基于C++的职工信息管理系统
  16. 中国农村统计年鉴下载链接
  17. DNS介绍,哪个好,速度快稳定
  18. 【Zabbix】Zabbix网络自动发现
  19. 从Mate X3看华为折叠屏手机的创新领启
  20. 华为云计算HCIE学习笔记-FusionStorage

热门文章

  1. JS三教九流系列-require.js-网站模块化开发
  2. 重构项目之一:大图展示
  3. Linux下基于Libmad库的MP3音乐播放器编写
  4. tftp 在线更新 cisco switch IOS
  5. phrases practice_七年级短语、固定搭配练习题Phrases practice for Grade seven
  6. 华为云客户端_效果图云渲染已成趋势,云渲染如何选择?
  7. 【学习笔记】月末操作-外币评估
  8. se30分析程序运行时间实例
  9. 生产企业开具加工费发票的问题
  10. ABAP-获取用户的组织结构权限