Web Crawler(上)

Web Crawler

一、预备知识

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-Document

Object Model),描述处理网页内容的方法和接口、(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()!

13、XML是可扩展标记语言,HTML 是超文本标记语言:XML 语法比较严谨而 HTML 语法比较松散;XML 主要用于数据格式化存储而 HTML 主要用于网页的编辑;XML 语言是对超文

本标记语言的补充;为不同的目的而设计,XML 被设计用来传输和存储数据,其焦点是数据的内容,HTML 被设计用来显示数据,其焦点是数据的外观

14、cookie:大多数现代网站都会使用cookie跟踪用户是否已登录的状态信息。网站验证用户的登录凭据,就会在浏览器将其保存为一个cookie,包含:一个有服务器生成的令牌 + 登

录的有效时限 + 状态跟踪信息(20世纪90年代中期广泛使用)

二、Web Crawler相关的 Python 库

1、urllib标准库

1、urllib标准库的功能:网页请求数据、处理cookie、改变请求头和用户代理这些元数据的函数

2、urlopen函数功能:打开并读取从网络获取的远程对象,可以读取HTML文件、图像文件、以及其他任何文件流

2、BeautifulSoup库

1、BeautifulSoup库 通过定位 HTML 标签来格式化和组织复杂的网页信息;通过简单易用的 python 对象展示 XML 结构信息

2、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',但是关键问题和瓶颈是宽带速度而不是抓取速度!

3、re库

  re库是Python中善于处理正则表达式的第三方库

4、Requests库

  Requests库是一个擅长处理复杂的 HTTP 请求、cookie、header等内容的第三方库

5、Selenium库

  Selenium库是一个强大的网页抓取工具,Selenium可以让浏览器自动加载网站,获取需要的数据,甚至对网页截屏,或者判断网站上是否发生了某些操作。Selenium库可以和第三方浏览器集成运行,处理cookie、JavaScript、header等内容

6、PhantomJS库

  PhantomJS是一个无头浏览器,PhantomJS将网站加载到内存并执行页面上的JavaScript,但是它不会像用户展示网页的图形界面。PhantomJS库和Selenium库结合使用可以运行一个非常强大的网络爬虫,处理cookie、JavaScript、header等内容

7、框架:Scrapy

  Scrapy框架可以帮助用户处理:找出网页的所有链接、评估内链和外链的差异、‘漫步’等功能的诸多细节,用户只需要:定义网页模板、定义抓取的其实位置等

8、PyMySQL、mysqldb

  PyMySQL是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb

9、NLTK库

  NLTK(自然语言工具包)适用于识别和标记阴雨文本中单词的词性的Python库。NLTK库擅长生成统计信息,包括一段文字的单词数量、单词频率和单词词性进行统计

10、OCR(optical character recognition 光学字符识别):Pillow库+Tesseract库+pytesseract库

  Pillow库和Tesseract库互为补充:Pillow库执行第一步:清洗和过滤图像、Tesseract库尝试将图像的形状和库里面存储的信息相匹配

  Pillow库支持Python3.x,Pillow库可以轻松导入图片,可以实现过滤、修饰、对图片进行像素级变换处理等功能

  Tesseract库通过训练可以识别出任何字体(风格不变的前提下),也可以识别出任何 Unicode 字符

  pytesseract库利用已经安装好的Tesseract库读取图像文件并输出字符串和可用在Python代码中的对象

11、Numpy库

  Numpy库是一个非常强大的库,Numpy库具有大量线性代数以及大规模科学计算的方法。Numpy库可以用数学方法把图片表示成巨大的像素数组。Numpy库可以和Tesseract库流畅的配合使用

三、处理异常

1、网页爬虫异常,由于网页数据格式异常,网页爬虫出现异常的情况:一、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)

四、数据清洗

1、数据清理规则,根据规则创建不同的函数:

规则1、n-gram:表示文字或语言中n个连续的单词组成的序列

规则2、“句子”(‘句点+空格’):字符串引入“句子”的概念,将漫长的字符串划分为一个一个“句子”,同一个“句子”中相连的单词才具有意义。否则清理的数据会:无效或者歧义

规则3、单词两端的标点符号去除(空白字符、不间断空格、制表符、换行符等),但是单词内部的标点符号保存

规则4、去除 I、a之外的单字符单词

2、数据标准化

1、数据标准化过程需要保存清洗后的数据在语言学或逻辑上是等价的

2、数据标准化算法:唯一的 n-gram 序列的数量会减少,而 n-gram 序列的总数不变(n-gram的唯一和不唯一的项目的数量)

3、目标信息或者中间信息的实例的频率:记录实例出现的频率,有助于对比不同的数据清洗和数据标准化算法的效果:一、Python中的collections库中Counter类,创建Counter()实例(需要将列表对象转换为字符串对象)二、Python字典实现:值为出现的频率次数(需要更多的管理和排序技巧

posted @ 2019-12-08 04:57  石斛  阅读(436)  评论(0编辑  收藏  举报