python爬虫实例详解


Posted in Python onJune 19, 2018

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

爬虫简单架构

python爬虫实例详解

程序入口函数(爬虫调度段)

#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)

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_url

网页下载器

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()

网页解析器

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
  #<dd class="lemmaWgt-lemmaTitle-title"><h1>Python</h1>获得标题标签
  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())
  #<div class="lemma-summary" label-module="lemmaSummary">
  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_data

网页输出器

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("<head><meta http-equiv='content-type' content='text/html;charset=utf-8'></head>")
  fout.write('<html>')
  fout.write('<body>')
  fout.write('<table border="1">')
  # <th width="5%">Url</th>
  fout.write('''<tr style="color:red" width="90%">
     <th>Theme</th>
     <th width="80%">Content</th>
     </tr>''')
  for data in self.datas:
   fout.write('<tr>\n')
   # fout.write('\t<td>%s</td>' % data['url'])
   fout.write('\t<td align="center"><a href=\'%s\'>%s</td>' % (data['url'], data['title']))
   fout.write('\t<td>%s</td>\n' % data['summary'])
   fout.write('</tr>\n')
  fout.write('</table>')
  fout.write('</body>')
  fout.write('</html>')
  fout.close()

运行结果

python爬虫实例详解

附:完整代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用plotly绘制数据图表的方法
Jul 18 Python
Python实现求解括号匹配问题的方法
Apr 17 Python
用python处理图片之打开\显示\保存图像的方法
May 04 Python
Python利用matplotlib做图中图及次坐标轴的实例
Jul 08 Python
Django框架ORM数据库操作实例详解
Nov 07 Python
Python3标准库之dbm UNIX键-值数据库问题
Mar 24 Python
python使用信号量动态更新配置文件的操作
Apr 01 Python
python实现输入三角形边长自动作图求面积案例
Apr 12 Python
python函数map()和partial()的知识点总结
May 26 Python
python如何写出表白程序
Jun 01 Python
基于 Python 实践感知器分类算法
Jan 07 Python
Python爬取某平台短视频的方法
Feb 08 Python
Python实现的NN神经网络算法完整示例
Jun 19 #Python
python中的二维列表实例详解
Jun 19 #Python
Tensorflow中使用tfrecord方式读取数据的方法
Jun 19 #Python
python3实现SMTP发送邮件详细教程
Jun 19 #Python
Python SVM(支持向量机)实现方法完整示例
Jun 19 #Python
Tensorflow使用tfrecord输入数据格式
Jun 19 #Python
Tensorflow 训练自己的数据集将数据直接导入到内存
Jun 19 #Python
You might like
老照片 - 几十年前的收音机与人
2021/03/02 无线电
thinkPHP自动验证机制详解
2016/12/05 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
document.documentElement的一些使用技巧
2013/04/18 Javascript
javascript中onclick(this)用法介绍
2013/04/19 Javascript
jquery得到font-size属性值实现代码
2013/09/30 Javascript
Jquery中children与find之间的区别详细解析
2013/11/29 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
JavaScript中用于生成随机数的Math.random()方法
2015/06/15 Javascript
JS使用parseInt解析数字实现求和的方法
2015/08/05 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
jquery实现图片预加载
2015/12/25 Javascript
jQuery实用密码强度检测
2017/03/02 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
使用vscode快速建立vue模板过程详解
2019/10/10 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
python实现将文本转换成语音的方法
2015/05/28 Python
django之session与分页(实例讲解)
2017/11/13 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
python列表,字典,元组简单用法示例
2019/07/11 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
python 创建一维的0向量实例
2019/12/02 Python
Pytorch DataLoader 变长数据处理方式
2020/01/08 Python
pandas分批读取大数据集教程
2020/06/06 Python
深入探究HTML5的History API
2015/07/09 HTML / CSS
函授本科毕业自我鉴定
2013/10/09 职场文书
促销活动总结范文
2014/04/30 职场文书
效能监察建议书
2014/05/19 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
天猫活动策划方案
2014/08/21 职场文书
(开源)微信小程序+mqtt,esp8266温湿度读取
2021/04/02 Javascript
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android