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中暂存上传图片的方法
Feb 18 Python
Python2.X/Python3.X中urllib库区别讲解
Dec 19 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
Feb 26 Python
基于python3 OpenCV3实现静态图片人脸识别
May 25 Python
一文了解Python并发编程的工程实现方法
May 31 Python
Python使用MyQR制作专属动态彩色二维码功能
Jun 04 Python
Python 实现交换矩阵的行示例
Jun 26 Python
Python将主机名转换为IP地址的方法
Aug 14 Python
python3 selenium自动化测试 强大的CSS定位方法
Aug 23 Python
python图形界面开发之wxPython树控件使用方法详解
Feb 24 Python
Python Selenium安装及环境配置的实现
Mar 17 Python
django模型类中,null=True,blank=True用法说明
Jul 09 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 curl 伪造IP来源的实例代码
2012/11/01 PHP
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
php中Ctype函数用法详解
2014/12/09 PHP
php中的单引号、双引号和转义字符详解
2017/02/16 PHP
Javascript 圆角div的实现代码
2009/10/15 Javascript
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
完美实现仿QQ空间评论回复特效
2015/05/06 Javascript
jquery+html5烂漫爱心表白动画代码分享
2015/08/24 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
2015/11/03 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
2016/09/22 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
vue动态绑定组件子父组件多表单验证功能的实现代码
2018/05/14 Javascript
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
JS滚轮控制图片缩放大小和拖动的实例代码
2018/11/20 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
vue组件是如何解析及渲染的?
2021/01/13 Vue.js
Python数据结构之单链表详解
2017/09/12 Python
Python探索之修改Python搜索路径
2017/10/25 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
Python中super函数用法实例分析
2019/03/18 Python
python编写计算器功能
2019/10/25 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
中学实习教师自我鉴定
2013/12/12 职场文书
初三物理教学反思
2014/01/21 职场文书
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
出国留学计划书
2014/04/27 职场文书
建党伟业的观后感
2015/06/01 职场文书
春晚观后感
2015/06/11 职场文书
python 爬取天气网卫星图片
2021/06/07 Python
Python基本的内置数据类型及使用方法
2022/04/13 Python
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android