Python网络爬虫(上)
概述
预备知识
1、如何处理包含大量 JavaScript(JS)的页面以及如何处理登录问题
2、screen scraping(网页抓屏)、data mining(数据挖掘)、web harvesting(网页收割)、网页抓取、web crawler(网络爬虫)、bot(网络机器人)
3、网页爬虫的优点:一、同时处理几千甚至几百万个网页;二、区别于传统搜索引擎,可以获取更加准确的数据信息;三、与 API 获取数据相比,网页爬虫灵活性更强
4、网页爬虫运用于:市场预测、机器语言翻译、医疗诊断领域、新闻网站、文章、健康论坛、宏观经济、生物基因、国际关系、健康论坛、艺术领域等方面数据获取和分析(分类和聚合)
5、网页爬虫涉及:数据库、网络服务器、HTTP协议、HTML语言(超文本标记语言 Hyper Text Markup Language)、网络安全、图像处理、数据科学等反面知识
6、网页的组成:HTML文本格式层、CSS样式层(Cascading Style Sheets)、JavaScript 执行层、图像渲染层
7、JavaScript思路:(1)借鉴C语言的基本语法、(2)借鉴Java语言的数据类型和内存管理、(3)借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位、(4)借鉴Self语言,使用基于原型(prototype)的继承机制。JavaScript组成:(1)核心(ECMAScript), 描述了该语言的语法和基本对象、(2)文档对象模型(DOM),描述处理网页内容的方法和接口、(3)浏览器对象模型(BOM),描述与浏览器进行交互的方法和接口。JavaScript程序库:jQuery、Prototype、MooTools等
8、HTML文本结构:HTML的结构是一个树状结构,在内存中形成一棵树
9、HTML只负责文档的结构和内容,表现形式完全交给CSS,CSS基本语法:选择器 { 属性:值; 属性:值; 属性:值;}(tagAttributes)
10、浏览器加载的网页需要加载许多相关的资源文件,包括:图像文件、JavaScript文件、CSS文件、链接其他网页的URL地址信息等
11、浏览器加载服务器资源,根据标签如<img src=‘cutkitten.jpg‘>,会创建数据包,命令操作系统向服务器发送请求,然后把获取的数据解释成图像。浏览器就是代码,而代码可以分解成许多基本组件,可以重写、重用以及根据需求进行修改
12、.get_text():清除HTML文档中所有的tagName、超链接、段落等无用的信息。通常在准备打印、存储、操作最终数据时,使用.get_text()!
开发工具及原理分析
1、urllib标准库、urllib.request import urlopen
1.1、urllib标准库的功能:网页请求数据、处理cookie、改变请求头和用户代理这些元数据的函数
1.2、urlopen函数功能:打开并读取从网络获取的远程对象,可以读取HTML文件、图像文件、以及其他任何文件流
2、BeautifulSoup库
2.1、XML是可扩展标记语言,HTML 是超文本标记语言:XML 语法比较严谨而 HTML 语法比较松散;XML 主要用于数据格式化存储而 HTML 主要用于网页的编辑;XML 语言是对超文本标记语言的补充;为不同的目的而设计,XML 被设计用来传输和存储数据,其焦点是数据的内容,HTML 被设计用来显示数据,其焦点是数据的外观
2.2、BeautifulSoup库 通过定位 HTML 标签来格式化和组织复杂的网页信息;通过简单易用的 python 对象展示 XML 结构信息
2.3、BeautifulSoup库创建 BeautifulSoup对象:bs=BeautifulSoup( html.read(),‘html.parser’),bs.HTML 标签(html.title、html.body.h1、html.body.div)
第一个参数:BeautifulSoup对象基于的HTML文本
第二个参数:BeautifulSoup对象创建该对象的解释器,‘html.parser‘、‘lxml‘、‘html5lib‘
1、‘lxml‘、‘html5lib‘优点:具容错性,如果HTML 标签(tagName)有异常:未闭合、未正确嵌套、缺失head标签、缺失body标签,‘lxml‘、‘html5lib‘可以进行一定的优化
2、‘html.parser‘、‘lxml‘、‘html5lib‘三种解释器的网页抓取速度也不一样,‘lxml‘>‘html.parser‘>‘html5lib‘,但是关键问题和瓶颈是宽带速度而不是抓取速度!
2.4、网页爬虫异常,由于网页数据格式异常,网页爬虫出现异常的情况:一、urlopen()出现问题;二、print(bs.h1)出现问题
一、urlopen()出现问题:
1、网页在服务器不存在:HTTPError:‘404 PageNot Found‘、‘505 Internet Server Error‘
2、服务器不存在:URLError
二、print(bs.h1)出现问题:
1、BeautifulSoup对象标签异常,不存在!None--->AttributeError!由于BeautifulSoup对象调用标签如果不存在,就会return None。如果再调用 None 下面的子标签,就会出现 AttributeError,所以需要避免两种情形的异常情况!
处理异常的思路:try...except...else...增加异常检查点。
from urllib.request import urlopen from urllib.error import HTTPError from bs4 import BeautifulSoup def getTitle(url): try: html = urlopen(url) except HTTPError as e: return None try: bsObj = BeautifulSoup(html.read(), "lxml") title = bsObj.body.h1 except AttributeError as e: return None return title title = getTitle("http://www.pythonscraping.com/pages/page1.html") if title == None: print("Title could not be found") else: print(title)
3、HTML解析:BeautifulSoup、正则表达式
3.1、网页爬虫代码加强灵活性和阅读性的思路:
1、方向一、网页PC版和APP版比较,对比PC版的HTML样式和APP版的HTML样式。选择适用性更强的版本,修改请求头状态,获取对应版本的状态。
2、方向二、JavaScript文件,通过网页加载的JavaScript文件里面包含的信息
3、方向三、URL链接中包含网页标题,直接从URL链接中获取目标信息
4、方向四、目标信息的源网页
3.2、BeautifulSoup运用:CSS语法中属性值查找标签、标签组、导航树(BeautifulSoup标签树导航)
1、bs.tagName
2、bs.find_all(tagName,tagAttributes )
3、编写网络爬虫:scrapy
4、存储目标信息:MySQL
运用实例
原文地址:https://www.cnblogs.com/yinminbo/p/11992200.html