#Python进阶(二十)-Python爬虫实例讲解

本篇博文主要讲解Python爬虫实例,重点包括爬虫技术架构,组成爬虫的关键模块:URL管理器、HTML下载器和HTML解析器。

##爬虫简单架构

![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/e8f3a1db63d42ea7115d277ba869a35c.png) ##程序入口函数(爬虫调度段)

#coding:utf8

import time, datetime

from maya_Spider import url_manager, html_downloader, html_parser, html_outputer

class Spider_Main(object): #初始化操作 def __init__(self): #设置url管理器 self.urls = url_manager.UrlManager() #设置HTML下载器 self.downloader = html_downloader.HtmlDownloader() #设置HTML解析器 self.parser = html_parser.HtmlParser() #设置HTML输出器 self.outputer = html_outputer.HtmlOutputer() #爬虫调度程序 def craw(self, root_url): count = 1 self.urls.add_new_url(root_url) while self.urls.has_new_url(): try: new_url = self.urls.get_new_url() print('craw %d : %s' % (count, new_url)) html_content = self.downloader.download(new_url) new_urls, new_data = self.parser.parse(new_url, html_content) self.urls.add_new_urls(new_urls) self.outputer.collect_data(new_data) if count == 10: break count = count + 1 except: print('craw failed') self.outputer.output_html()

if __name__ == '__main__': #设置爬虫入口 root_url = 'http://baike.baidu.com/view/21087.htm' #开始时间 print('开始计时..............') start_time = datetime.datetime.now() obj_spider = Spider_Main() obj_spider.craw(root_url) #结束时间 end_time = datetime.datetime.now() print('总用时:%ds'% (end_time - start_time).seconds)1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

##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: return if 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: return for url in urls: self.add_new_url(url) def has_new_url(self): return len(self.new_urls) != 0 def get_new_url(self): new_url = self.new_urls.pop() self.old_urls.add(new_url) return new_url1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

##网页下载器

import urllib

import urllib.request

class HtmlDownloader(object): def download(self, url): if url is None: return None #伪装成浏览器访问,直接访问的话csdn会拒绝 user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers = {'User-Agent':user_agent} #构造请求 req = urllib.request.Request(url,headers=headers) #访问页面 response = urllib.request.urlopen(req) #python3中urllib.read返回的是bytes对象,不是string,得把它转换成string对象,用bytes.decode方法 return response.read().decode()1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

##网页解析器

import re

import urllib

from urllib.parse import urlparse

from bs4 import BeautifulSoup

class HtmlParser(object): def _get_new_urls(self, page_url, soup): new_urls = set() #/view/123.htm links = soup.find_all('a', href=re.compile(r'/item/.*?')) for link in links: new_url = link['href'] new_full_url = urllib.parse.urljoin(page_url, new_url) new_urls.add(new_full_url) return new_urls #获取标题、摘要 def _get_new_data(self, page_url, soup): #新建字典 res_data = {} #url res_data['url'] = page_url #

Python

获得标题标签 title_node = soup.find('dd', class_="lemmaWgt-lemmaTitle-title").find('h1') print(str(title_node.get_text())) res_data['title'] = str(title_node.get_text()) #

summary_node = soup.find('div', class_="lemma-summary") res_data['summary'] = summary_node.get_text() return res_data def parse(self, page_url, html_content): if page_url is None or html_content is None: return None soup = BeautifulSoup(html_content, '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_data1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

##网页输出器

class HtmlOutputer(object): def __init__(self): self.datas = [] def collect_data(self, data): if data is None: return self.datas.append(data ) def output_html(self): fout = open('maya.html', 'w', encoding='utf-8') fout.write("

") fout.write('') fout.write('') fout.write('

Theme Content
%s %s %s

') fout.write('') fout.write('') fout.close()1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

##运行结果

![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/f9c024e20306fb0e4e3e84a15aab3217.png)

文章来源: shq5785.blog.csdn.net,作者:No Silver Bullet,版权归原作者所有,如需转载,请联系作者。

原文链接:shq5785.blog.csdn.net/article/details/66472363

python爬虫进阶案例,Python进阶(二十)-Python爬虫实例讲解相关推荐

  1. Python爬虫_案例分析(二)

    Python爬虫_案例分析(二) 一.电影天堂案例 import scrapy from scrapy_movie.items import ScrapyMovieItem class MvSpide ...

  2. Python爬虫新手入门教学(二十):爬取A站m3u8视频格式视频

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 前文内容 Python爬虫新手入门教学(一):爬取豆瓣电影排行信息 Python爬虫新手入门 ...

  3. 有没有比python更简单的语言排名_5月语言排行榜:R跌出前二十 Python紧咬C++

    在进入 TOP 20 大约三年后,用于数据统计的 R 语言在本月首次跌出前二十名 Python 保持积极的发展速度,继续缩小与 C++ 的排名差距 Swift 排名较上个月有所上升,不过与 Objec ...

  4. python sys模块_Python 基础(二十):sys 模块

    1. 简介 sys 模块主要负责与 Python 解释器进行交互,该模块提供了一系列用于控制 Python 运行环境的函数和变量. 之前我们说过 os 模块,该模块与 sys 模块从名称上看着好像有点 ...

  5. python将list转为矩阵_python list转矩阵的实例讲解

    python list转矩阵的实例讲解 如下所示: #list转矩阵,矩阵列合并 x = [[1.2,2.2,1.4],[1.3,2.4,2.1],[1,1,0]] #表示有三个点,第一个点为(1,2 ...

  6. python if else 嵌套格式_python中if嵌套命令实例讲解

    一.嵌套命令计算机执行的顺序 缩进相同的命令处于同一个等级,第一步,计算机就要按顺序一条一条地执行命令. 1.先给score赋值: 2.因为if和else是只能留一个的互斥关系,if和else下的代码 ...

  7. python逐行写入文件_python逐行读写txt文件的实例讲解

    实例如下所示: # -*-coding:utf-8-*- import os file_obj = open("test2.txt") all_lines = file_obj.r ...

  8. 用python如何制作表格步骤_Python中用xlwt制作表格实例讲解

    在Python中,我们也可以用xlwt来制作excel表格,是不是很神奇,接下来一起学习吧. 举例: ```python import xlwt wb = xlwt.Workbook(encoding ...

  9. python 按键精灵_python中用ctypes模拟点击的实例讲解

    在小编学习python中的模拟点击之前,我们想要对某一项操作进行自动指令的重复,可以选择大家熟知的按键精灵.那么对比python的模拟点击,小编还是觉得python中使用更加方便.这样说不能让有些小伙 ...

最新文章

  1. vector 作为dll 接口参数_DLL中传递STL参数,vector对象作为dll参数传递等问题(转)...
  2. java线程学习第一天__低配版的卖面包机
  3. 消息中间件Kafka与RabbitMQ谁更胜一筹?
  4. mysql存储过程中like用法
  5. DSP2812之定时器
  6. 轻松盘,资产盘点不再难 RFID办公资产盘点管理
  7. 算法三十四:最近点对
  8. cygwin安装指南
  9. 电脑win7做系统备份
  10. SpringBoot 自动配置初探
  11. 26岁学编程会不会已经晚了?
  12. 必应每日壁纸API HTML 使用必应每日API为背景 css 背景图片 加模糊 遮罩
  13. 京东辟谣程序员在页面置入骂人代码
  14. element下拉列表触发_记一次vue长列表的内存性能分析和优化
  15. 对同性恋的称呼与禁忌(不足的请补充啊)
  16. PCI/PCIe基础
  17. android6.0重力工具箱,GravityBox[MM]下载-重力工具箱 GravityBox[MM] v6.3.6_手机乐园
  18. Zend Framework入门教程
  19. php批量excel转word
  20. 云储存将成未来大规模视频监控储存主要模式

热门文章

  1. 股权融资的A、B、C、D轮
  2. 【面试总结】JNI层MediaScanner的分析,挥泪整理面经
  3. Vue通过spark-md5.js上传本地md5文件
  4. ios版本与xcode版本
  5. 2016年中国未来的新兴行业推荐
  6. java和c#通过esb服务互调用组件
  7. 猜数游戏(实现) 后附源码
  8. XMind教程详解之畅通使用
  9. win7临时文件_小甲办公 | 如何在2020年优雅地使用win7
  10. OSChina 周二乱弹 —— 求借妹纸肩膀一用!