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的Django框架中的ORM建立查询API
Apr 20 Python
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 Python
Python实现图片滑动式验证识别方法
Nov 09 Python
运动检测ViBe算法python实现代码
Jan 09 Python
解决seaborn在pycharm中绘图不出图的问题
May 24 Python
python实现自动网页截图并裁剪图片
Jul 30 Python
python使用scrapy发送post请求的坑
Sep 04 Python
Python使用random.shuffle()打乱列表顺序的方法
Nov 08 Python
python通过配置文件共享全局变量的实例
Jan 11 Python
python 遗传算法求函数极值的实现代码
Feb 11 Python
python 实现两个线程交替执行
May 02 Python
keras实现theano和tensorflow训练的模型相互转换
Jun 19 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
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
PHP7.0版本备注
2015/07/23 PHP
PHP设计模式之简单投诉页面实例
2016/02/24 PHP
javascript GUID生成器实现代码
2009/10/31 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
不使用浏览器运行javascript代码的方法
2013/07/24 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
JS实现太极旋转思路分析
2016/12/09 Javascript
canvas雪花效果核心代码分享
2017/02/19 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
2018/04/23 jQuery
vue在手机中通过本机IP地址访问webApp的方法
2018/08/15 Javascript
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
python每次处理固定个数的字符的方法总结
2013/01/29 Python
Python常用模块用法分析
2014/09/08 Python
Python中用Descriptor实现类级属性(Property)详解
2014/09/18 Python
Python中实现结构相似的函数调用方法
2015/03/10 Python
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
python的mysqldb安装步骤详解
2017/08/14 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
使用python画个小猪佩奇的示例代码
2018/06/06 Python
python 3.7.0 安装配置方法图文教程
2018/08/27 Python
对pandas中两种数据类型Series和DataFrame的区别详解
2018/11/12 Python
Python Tkinter 简单登录界面的实现
2019/06/14 Python
Python OpenCV调用摄像头检测人脸并截图
2020/08/20 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
化学教师自荐信范文
2013/12/28 职场文书
小学生班会演讲稿
2014/01/09 职场文书
小加工厂管理制度
2014/01/21 职场文书
询价采购方案
2014/06/09 职场文书
超市促销活动总结
2014/07/01 职场文书
质量主管工作职责
2014/09/26 职场文书
滞留工资返还协议书
2014/10/19 职场文书
幼儿园园长新年寄语
2015/08/17 职场文书