爬虫

爬虫

这段代码有什么问题吗

回复

韩6051db7c2433c 发起了问题 1 人关注 0 个回复 10 次浏览 2021-10-15 14:18 来自相关话题

空气质量指数计算v7.0获取所有城市aqi只能获取前面十几个城市,并且很多报错

回复

韩6051db7c2433c 发起了问题 1 人关注 0 个回复 17 次浏览 2021-10-13 12:16 来自相关话题

请用准确的语言描述您发布的问题思想

回复

魏6166425ef213e 发起了问题 1 人关注 0 个回复 27 次浏览 2021-10-13 11:55 来自相关话题

求助 [root@ur firefox]# firefox Error: no DISPLAY environment variable specified

tiankong 回复了问题 3 人关注 2 个回复 8286 次浏览 2019-07-30 14:13 来自相关话题

pycharm下 from lxml import etree, 显示etree找不到

Lasson李 回复了问题 4 人关注 4 个回复 4868 次浏览 2019-05-30 16:51 来自相关话题

爬虫课:simhash分块存储,为什么不把5块合并成4块?

多哈厚度 回复了问题 5 人关注 3 个回复 1753 次浏览 2019-05-12 23:54 来自相关话题

这个代码,爬不出结果

ORCA 回复了问题 2 人关注 1 个回复 1170 次浏览 2019-03-05 18:05 来自相关话题

python的爬虫问题

回复

max为 发起了问题 1 人关注 0 个回复 1128 次浏览 2019-01-10 15:16 来自相关话题

各位大神老师,Windows下同时安装了python2和python3的情况下如何pip pybloomfilter 啊

泽南Alpha 回复了问题 3 人关注 2 个回复 1501 次浏览 2019-01-04 21:46 来自相关话题

ReCaptcha的验证码是否可以绕过?

回复

Popcorn_Dzz 发起了问题 1 人关注 0 个回复 2362 次浏览 2018-11-13 10:36 来自相关话题

你们有没有碰到 装BloomFilter模块 出现[-]calg library: http://c-algorithms.sourceforge.net

2261f 回复了问题 2 人关注 1 个回复 1889 次浏览 2018-08-29 16:46 来自相关话题

利用selenium+chrome的方式访问淘宝手机页面

回复

唯我独尊 发起了问题 1 人关注 0 个回复 2624 次浏览 2018-08-08 22:54 来自相关话题

爬虫问题-请问老师怎么爬取社保、公积金、运营商数据哪?

回复

呼呼大睡 回复了问题 1 人关注 1 个回复 3802 次浏览 2018-05-19 20:28 来自相关话题

@杨真老师,win7系统如何搭建爬虫环境?

listen6os 回复了问题 2 人关注 2 个回复 1565 次浏览 2018-05-01 10:29 来自相关话题

请问selenium如何得到ajax刷新页面后的源代码?

回复

JasonGo 发起了问题 1 人关注 0 个回复 2606 次浏览 2018-04-30 14:59 来自相关话题

OSError: libcalg.so.0: cannot open shared object file: No such file or directory 这个问题有人解决了没有?

无心疼8n0 回复了问题 2 人关注 1 个回复 1858 次浏览 2018-04-27 16:01 来自相关话题

在Linux虚拟机打开终端,直接输入pip install ltp 提示 pip command not found

泽南Alpha 回复了问题 2 人关注 1 个回复 1914 次浏览 2018-04-26 20:35 来自相关话题

scrapy-redis分布式爬取时如何加cookie啊

回复

Janzen 发起了问题 1 人关注 0 个回复 1970 次浏览 2018-04-26 14:53 来自相关话题

第三课 多线程及分布式爬虫

酱油先生 发表了文章 1 个评论 1156 次浏览 2018-04-25 19:21 来自相关话题

一、多线程爬虫 (1)多线程的复杂性 a.资源、数据的安全性:锁保护 b.原子性:数据操作是天然互斥的 c.同步等待:wait()、noti ...查看全部
一、多线程爬虫

image.png

(1)多线程的复杂性
a.资源、数据的安全性:锁保护
b.原子性:数据操作是天然互斥的
c.同步等待:wait()、notify()、notifyAll()
d.死锁:多个线程多资源互锁,造成死锁
e.容灾:任何线程出现错误,整个进程都会停止
(2)多线程的优势
a.内存空间共享
b.提高CPU使用效率
c.开发便捷
d.轻、创建、销毁的开销小

image.png

(3)Python线程
a.支持多线程(JavaScript、PHP不支持多线程)
b.python线程直接映射到native线程,(Java1.4的Java线程是JVM实现的,共同运行在一个native thread)
c.GIL(Global Interpretor Lock):对于多核的应用能力有限
(4)实现一个多线程爬虫
a.创建一个线程池thread=
b.确认url队列线程安全Queue Deque
c.从队列取出url,分配一个线程开始爬取pop()/get() threading.Thread
d.如果线程池满了,循环等待,直到线程结束t.is_alive()
e.从线程池移除已经完成下载的线程threads.remove(t)
f.如果当前级别的url已遍历完成,t.join()函数等待所有线程结束,然后开始下一级别的爬取
(4)多线程爬虫评价
优势:
1.有效利用CPU时间
2.极大减小下载出错、阻塞对抓取速度的影响,整体上提高下载的速度
3.对于没有反爬虫限制的网站,下载速度可以多倍增加
局限性:
1.对于有反爬的网站,速度提升有限
2.提高了复杂度,对编码要求高
3.线程越多,每个线程获得的时间就越少,同时线程切换更频繁也带来额外开销
4.线程之间资源竞争更激烈
二、多进程爬虫

image.png


image.png

(1)多进程爬虫评估
目的:
1.控制线程数量;
2.对线程进行隔离,减少资源竞争
3.某些环境下,在单机上利用多个IP来伪装
局限性:
1.不能突破网络瓶颈
2.单机单IP的情况下变得没有意义
3.数据交换的代价更大
(2)进程间通信
1.管道(PIPE)
2.信号(Signal):复杂
3.消息队列:Posix及system V
4.共享内存:速度最快,需要结合信号量达到进程间同步及互斥
5.信号量:用于数据同步
6.Socket:可以标准化,可以用于多机
(3)Android进程通信Binder

image.png

(4)Android进程通信AIDL

image.png

(5)创建多进程爬虫
Solution A - C/S模式
1.一个服务进程,入队及出队URL,入队需检查是否已经下载
2.监控目前的爬取状态,进度
3.多个爬取进程,从服务进程获取url,并将新的url返回给服务进程
4.使用Socket来做IPC
Solution B- 数据库模式
1.使用数据库来读写爬取列表
2.多个爬取进程,url的获取与增加都通过数据库操作
(6)C/S v.s.数据库
CS优势
1.运行速度快,添加、修改、查询都是内存的BIT位操作
2.扩展方便,例如动态url队列重排
数据库:
1.开发便捷,数据库天生具备读写保护及支持IPC
2.只需写一个爬虫程序
(7)创建MYSQL数据库表

image.png


image.png


image.png

三、分布式系统
(一)概念
(1)、A program
            is the code you write
(2)、A process
            is what you get when you run it
(3)、A message
            is used to communicate between processes
(4)、A packet
           is a fragment of a message that might travel on a wire
(5)、A protocol
           is a formal description of a message formats and the rules that two processes must follow in                     order to exchange those messages
(6)、A network
         is the infrastructure that links computer,workstations ,terminals,servers etc.It consists of routers             which are connected by communication links.
(7)、A component
         can be a process or any piece of hardware required to run a process,support communitions                       between processes,store data,etc.
(8)、A distributed system
        is an application that executes a collection of  protocols to coordinate the actions of multiple                    processes on a network,such that all components cooperate together perform a single or small              set of related tasks.
(二)、优势
(1)容错
(2)高可用
(3)可恢复
(4)一致性
(5)scalable:It can operate correctly even as some aspect of the system is scaled to a large size.
(6)predictable performance:the ability to provide desired responsiveness in a timely manner.
(7)安全性
(三)、分布式爬虫系统

image.png

四、Master-Slave结构
(一)、Master-Slave结构
(1)、有一个主机对所有服务器进行管理。绝大多数分布式系统,都是master-slave的主从模式。而我们之前的的爬虫是完全独立的,依次从URL队列里获取URL,进行抓取。
(2)、当爬虫服务器多的时候,必须能通过一个中心节点对从节点进行管理
(3)、能对整体的爬取进行控制
(4)、爬虫之间信息共享的桥梁
(5)、负载控制
(一)、Remote Procedure Calls
(1)、Specifies the protocol for client-server communitions
(2)、Develops the client program
(3)、Develops the server program

image.png

 

visual studio,pybloomfilter,pycharm,anaconda 这些软件都要装在虚拟机上吗

回复

张亚荣89m 发起了问题 1 人关注 0 个回复 1196 次浏览 2018-04-25 12:49 来自相关话题

这段代码有什么问题吗

回复

韩6051db7c2433c 发起了问题 1 人关注 0 个回复 10 次浏览 2021-10-15 14:18 来自相关话题

空气质量指数计算v7.0获取所有城市aqi只能获取前面十几个城市,并且很多报错

回复

韩6051db7c2433c 发起了问题 1 人关注 0 个回复 17 次浏览 2021-10-13 12:16 来自相关话题

请用准确的语言描述您发布的问题思想

回复

魏6166425ef213e 发起了问题 1 人关注 0 个回复 27 次浏览 2021-10-13 11:55 来自相关话题

求助 [root@ur firefox]# firefox Error: no DISPLAY environment variable specified

回复

tiankong 回复了问题 3 人关注 2 个回复 8286 次浏览 2019-07-30 14:13 来自相关话题

pycharm下 from lxml import etree, 显示etree找不到

回复

Lasson李 回复了问题 4 人关注 4 个回复 4868 次浏览 2019-05-30 16:51 来自相关话题

爬虫课:simhash分块存储,为什么不把5块合并成4块?

回复

多哈厚度 回复了问题 5 人关注 3 个回复 1753 次浏览 2019-05-12 23:54 来自相关话题

这个代码,爬不出结果

回复

ORCA 回复了问题 2 人关注 1 个回复 1170 次浏览 2019-03-05 18:05 来自相关话题

python的爬虫问题

回复

max为 发起了问题 1 人关注 0 个回复 1128 次浏览 2019-01-10 15:16 来自相关话题

各位大神老师,Windows下同时安装了python2和python3的情况下如何pip pybloomfilter 啊

回复

泽南Alpha 回复了问题 3 人关注 2 个回复 1501 次浏览 2019-01-04 21:46 来自相关话题

ReCaptcha的验证码是否可以绕过?

回复

Popcorn_Dzz 发起了问题 1 人关注 0 个回复 2362 次浏览 2018-11-13 10:36 来自相关话题

你们有没有碰到 装BloomFilter模块 出现[-]calg library: http://c-algorithms.sourceforge.net

回复

2261f 回复了问题 2 人关注 1 个回复 1889 次浏览 2018-08-29 16:46 来自相关话题

利用selenium+chrome的方式访问淘宝手机页面

回复

唯我独尊 发起了问题 1 人关注 0 个回复 2624 次浏览 2018-08-08 22:54 来自相关话题

爬虫问题-请问老师怎么爬取社保、公积金、运营商数据哪?

回复

呼呼大睡 回复了问题 1 人关注 1 个回复 3802 次浏览 2018-05-19 20:28 来自相关话题

@杨真老师,win7系统如何搭建爬虫环境?

回复

listen6os 回复了问题 2 人关注 2 个回复 1565 次浏览 2018-05-01 10:29 来自相关话题

请问selenium如何得到ajax刷新页面后的源代码?

回复

JasonGo 发起了问题 1 人关注 0 个回复 2606 次浏览 2018-04-30 14:59 来自相关话题

在Linux虚拟机打开终端,直接输入pip install ltp 提示 pip command not found

回复

泽南Alpha 回复了问题 2 人关注 1 个回复 1914 次浏览 2018-04-26 20:35 来自相关话题

scrapy-redis分布式爬取时如何加cookie啊

回复

Janzen 发起了问题 1 人关注 0 个回复 1970 次浏览 2018-04-26 14:53 来自相关话题

visual studio,pybloomfilter,pycharm,anaconda 这些软件都要装在虚拟机上吗

回复

张亚荣89m 发起了问题 1 人关注 0 个回复 1196 次浏览 2018-04-25 12:49 来自相关话题

redis报错redis.exceptions.ResponseError: DISCARD without MULTI。

回复

Janzen 发起了问题 1 人关注 0 个回复 3963 次浏览 2018-04-24 17:51 来自相关话题

第三课 多线程及分布式爬虫

酱油先生 发表了文章 1 个评论 1156 次浏览 2018-04-25 19:21 来自相关话题

一、多线程爬虫 (1)多线程的复杂性 a.资源、数据的安全性:锁保护 b.原子性:数据操作是天然互斥的 c.同步等待:wait()、noti ...查看全部
一、多线程爬虫

image.png

(1)多线程的复杂性
a.资源、数据的安全性:锁保护
b.原子性:数据操作是天然互斥的
c.同步等待:wait()、notify()、notifyAll()
d.死锁:多个线程多资源互锁,造成死锁
e.容灾:任何线程出现错误,整个进程都会停止
(2)多线程的优势
a.内存空间共享
b.提高CPU使用效率
c.开发便捷
d.轻、创建、销毁的开销小

image.png

(3)Python线程
a.支持多线程(JavaScript、PHP不支持多线程)
b.python线程直接映射到native线程,(Java1.4的Java线程是JVM实现的,共同运行在一个native thread)
c.GIL(Global Interpretor Lock):对于多核的应用能力有限
(4)实现一个多线程爬虫
a.创建一个线程池thread=
b.确认url队列线程安全Queue Deque
c.从队列取出url,分配一个线程开始爬取pop()/get() threading.Thread
d.如果线程池满了,循环等待,直到线程结束t.is_alive()
e.从线程池移除已经完成下载的线程threads.remove(t)
f.如果当前级别的url已遍历完成,t.join()函数等待所有线程结束,然后开始下一级别的爬取
(4)多线程爬虫评价
优势:
1.有效利用CPU时间
2.极大减小下载出错、阻塞对抓取速度的影响,整体上提高下载的速度
3.对于没有反爬虫限制的网站,下载速度可以多倍增加
局限性:
1.对于有反爬的网站,速度提升有限
2.提高了复杂度,对编码要求高
3.线程越多,每个线程获得的时间就越少,同时线程切换更频繁也带来额外开销
4.线程之间资源竞争更激烈
二、多进程爬虫

image.png


image.png

(1)多进程爬虫评估
目的:
1.控制线程数量;
2.对线程进行隔离,减少资源竞争
3.某些环境下,在单机上利用多个IP来伪装
局限性:
1.不能突破网络瓶颈
2.单机单IP的情况下变得没有意义
3.数据交换的代价更大
(2)进程间通信
1.管道(PIPE)
2.信号(Signal):复杂
3.消息队列:Posix及system V
4.共享内存:速度最快,需要结合信号量达到进程间同步及互斥
5.信号量:用于数据同步
6.Socket:可以标准化,可以用于多机
(3)Android进程通信Binder

image.png

(4)Android进程通信AIDL

image.png

(5)创建多进程爬虫
Solution A - C/S模式
1.一个服务进程,入队及出队URL,入队需检查是否已经下载
2.监控目前的爬取状态,进度
3.多个爬取进程,从服务进程获取url,并将新的url返回给服务进程
4.使用Socket来做IPC
Solution B- 数据库模式
1.使用数据库来读写爬取列表
2.多个爬取进程,url的获取与增加都通过数据库操作
(6)C/S v.s.数据库
CS优势
1.运行速度快,添加、修改、查询都是内存的BIT位操作
2.扩展方便,例如动态url队列重排
数据库:
1.开发便捷,数据库天生具备读写保护及支持IPC
2.只需写一个爬虫程序
(7)创建MYSQL数据库表

image.png


image.png


image.png

三、分布式系统
(一)概念
(1)、A program
            is the code you write
(2)、A process
            is what you get when you run it
(3)、A message
            is used to communicate between processes
(4)、A packet
           is a fragment of a message that might travel on a wire
(5)、A protocol
           is a formal description of a message formats and the rules that two processes must follow in                     order to exchange those messages
(6)、A network
         is the infrastructure that links computer,workstations ,terminals,servers etc.It consists of routers             which are connected by communication links.
(7)、A component
         can be a process or any piece of hardware required to run a process,support communitions                       between processes,store data,etc.
(8)、A distributed system
        is an application that executes a collection of  protocols to coordinate the actions of multiple                    processes on a network,such that all components cooperate together perform a single or small              set of related tasks.
(二)、优势
(1)容错
(2)高可用
(3)可恢复
(4)一致性
(5)scalable:It can operate correctly even as some aspect of the system is scaled to a large size.
(6)predictable performance:the ability to provide desired responsiveness in a timely manner.
(7)安全性
(三)、分布式爬虫系统

image.png

四、Master-Slave结构
(一)、Master-Slave结构
(1)、有一个主机对所有服务器进行管理。绝大多数分布式系统,都是master-slave的主从模式。而我们之前的的爬虫是完全独立的,依次从URL队列里获取URL,进行抓取。
(2)、当爬虫服务器多的时候,必须能通过一个中心节点对从节点进行管理
(3)、能对整体的爬取进行控制
(4)、爬虫之间信息共享的桥梁
(5)、负载控制
(一)、Remote Procedure Calls
(1)、Specifies the protocol for client-server communitions
(2)、Develops the client program
(3)、Develops the server program

image.png

 

第二课 登陆及动态网页抓取

酱油先生 发表了文章 0 个评论 1371 次浏览 2018-04-24 18:24 来自相关话题

一、XPath (1)、基本语法 (2)、@属性 在DOM 树,以路径的方式查询节点 通过 @符号来选取属性 ...查看全部
一、XPath
(1)、基本语法

image.png

(2)、@属性
在DOM 树,以路径的方式查询节点
通过 @符号来选取属性

image.png

rel  class href 都是属性,可以通过 "//*[@class='external text']" 来选取对应元素
= 符号要求属性完全匹配,可以用 contains contains 方法来部分匹配,例如:
“//*[contains(@class, ‘external’)]”  可以匹配,而 "//*[@class='external']"  则不能
(3)、运算符
and 和 or 运算符

image.png


二、正则表达式
正则表达式是对字符串操作的一种逻辑公式,就用事先定义好些特字符、及这些特定的组合,成一个“规则串”,串”用来表达对字符的一种过滤 逻辑
在爬虫的解析中,经常会将正则表达式与 Dom 选择器结合使用。正则表达式适用于字符串特征比较明显的情况,但是同样正则表达可能在HTML源码里多次出现;而Dom选择器可以通过 class及 id来精确找到DOM块,从而缩小查找范围。

image.png

(1)、爬虫常用规则
           a.获取标签下的文本,']*>(.*? )'
           b.查找特定类别的链接,例如 /wiki/不包含 Category 目录:
             '             'href=[\"\']{1}(//detail.taobao.com/item.htm[^>\"\'\s]+?)"'
(2)贪婪模式及非贪婪模式

image.png

 
三、动态网页
(1)、动态网页使用场景
• 单页模式
单页模式指的是不需要外部跳转网,例如个人设置中心经常就是单页
• 页面交互多的场景
一部分网页上,有很多的用户交互接口,例如去哪儿机票选择网页,用户可以反复修改查询的参数
• 内容及模块丰富的网页
有些网页内容很丰富,一次加载完对服务器压力大 ,而且这种方式延时也会很差,用户往往也不会查看所有内容
(2)、动态网页带来的挑战
对于爬虫:
• 简单下载 HMTL HMTL已经不行了,必须得有一个 Web容器来运行HTML的脚本
• 增加了爬取的时间
• 增加了计算机的 CPU 、内存的资源消耗
•增加了爬取的不确定性
对于网站:
• 为了配合搜索引擎的爬取,与相关信息会采用静态方式
•与搜索无关的信息,例如商品的价格评论,仍然会使用动态加载

image.png


image.png

(3)、分析动态网页
• 使用 BeyondCompare 或者 SVN等工具,来对比网页大致找出动态加载的部分
• 针对要提取的部分,别查看 html only与full webpage,找出动态数据的部分
• 记录下它们的 class 或 id , 试着用以下代码来提取,如果不能提取,说明是动态的:
from lxml import etree 
f = open ('./s7-full.htm')
c = f.read().decode( 'gbk')
f.close () 
e = etree.HTML (c) 
print e.xpath (u'//span[@class="price J-p-10524731933"]')
(4)、Python Web 引擎
• PyQt PySide :基于 QT 的python web 引擎,需要 图形界面的支持安装大量的以来 。安装和配置复杂,尤其是安装图形系统对于服务器来说代价很大。
• Selenium :一个自动化的 Web测试工具,可以支持包括 Firefox、 chrome、PhatomJS 、IE 等多种浏览器的的连接和测试。
PhantonJs:一个基于 Webkit的 Headless的Web引擎,支持JavaScript 。相比 PyQt 等方案, phamtoms可以部署在没有UI的服务器上。
PhantomJS + Selenium 
(5)、安装
Selenium 
pip install Selenium 
PhantomJS 
• PhantomJS 需要先安装 nodejs
# yum install nodejs
• 为了加速,将 NPM 的源改为国内的淘宝
$ npm install -g cnpm -- registry=https:// registry.npm.taobao.org registry.npm.taobao.orgregistry.npm.taobao.orgregistry.npm.taobao.org
• 利用 NPM的Package Manager安装phantomjs
$ npm-g install phantomjs -prebuilt
(6)、使用phantomjs来加载动态页面
# import webdriver from selenium
from selenium import webdriver
# load PhantomJS driver 
driver=webdriver.PhantomJS (service_args =['-- ignore -ssl -errors=true' ])
# set window size, better to fit the whole page in order to
# avoid dynamically loading data 
driver.set_window_size(1280 , 2400 ) # optional 
# data page content
driver.get(cur_url)
# use page_source to get html content
content = driver.page_source
 
(7)、set_window_size
对于动态网页,有可能存在大量数据是根视图来加载的PhantomJS允许客户端设置用来模拟渲染页面的窗口的尺寸,这个如尺寸如果设置比较小,我们就不得用javascript的scroll命令来模拟页面往下滑 动的效果以显示更多内容,所我们可设置一个相对大窗口高度来渲染
driver.set_window_size(1280 , 2400 ) # optional 
(8)、set_window_size
Selenium实现了一系列的类似于 xpath选择器的方法,使得我们可以直接 调用 river.find_element () 来进行元素的选择,但是这些都基于 Python 的实现,执行效率非常低大约是基于 C的 正则表达式或 lxml的10 倍的时间 ,因此 不建议使用 built -in 的选择器,而是采用 lxml或者 re 对 driver.page_source(html 文本)进行操作
find_element(self, by='id', value=None)
find_element_by_class_name(self, name)
find_element_by_id(self, id_)
find_element_by_css_selector(self, css_selector)
(9)、Useful Methods & Properties
Selenium通过浏览器的驱动,支持大量HTML及Javascript的操作,常用的可以包括:
• page_source : 获取当前的 html文本
• title:HTML的title
• current_url:当前网页的 URL
• get_cookie() &get_cookies() :获取当前的 cookie cookie
• delete_cookie() &delete_all_cookies() :删除所有的cookie
• add_cookie() :添加一段 cookie
• set_page_load_timeout() :设置网页超时
• execute_script() :同步执行一段 javascript命令
• execute_async_script() :异步执行 javascript命令
(10)、Close and Clear
Selenium通过内嵌的浏览器 driver与浏览器进程通信,因此在退出的时 候必须调用 driver.close() 及 driver.quit() 来退出 PhantomJS,否则PhantomJS会一直运行在后台并占用系统资源。

image.png

1.send_signal is recommended
driver.service.process.send_signal(signal.SIGTERM)
2. driver.close () this is not guaranteed to close PhantomJS
3. to assure it's closed, run below command in terminal pgrep phantomjs | xargs kill
 
(11)、提取动态数据
1. 加载的过程中,根据网络环境优劣会存在一些延时因此要多次尝试提取,提取不到不意味着数据不存在或者网络出错
2. 动态页面的元素,所使用id或 class经常会不止一 个,例如京东件商品的“好评率”, class包括了rate 和 percent -con 两种,因此需要对两种情况都进行尝试。更通用的,如果一个元素不能找到而selenium并没有报网络错误,那么可能这个元素的class或id有了新的定义,我们需要将找不到页面及元素信息记录在日志里,使得后续可以分析,找出新的定义并对这一类页面重新提取信息。

image.png


image.png


image.png


image.png


image.png

 

image.png

 

第一课 爬虫的基础技术

酱油先生 发表了文章 0 个评论 1180 次浏览 2018-04-23 18:13 来自相关话题

一、HTTP协议及HTML相关技术 (一)、HTTP协议 ...查看全部
一、HTTP协议及HTML相关技术
(一)、HTTP协议

image.png


1.png


2.png



 
(二)、HTTP HEADER


image.png


红色标记比较重要
Keep-Alive功能使客户端到服务器的连接持续有效,当出现对后继请求时, Keep-Alive功能避免了建立或者重新建立连接。
HTTP/1.1默认所有情况下在HTTP1.1中所有连接都被保持,除非在请求头或响应头中指明要关闭:Connection:Close

image.png


(三)、HTTP请求方法

image.png


(四)、HTTP响应状态码
1、2XX  成功
2、3XX  跳转
3、4XX  客户端错误
4、5XX  服务器错误
 
300
1、300 Multiple Choices 存在多个可用的资源,处理或丢弃
2、301 Moved Permanetly重定向
3、302 Found 重定向
4、304 Not Modified 请求的资源未更新,丢弃
一些 Python 库,例如urllib2已结对重定向做了处理,会自动跳转;动态网页处理的时候也是自动跳转,所以不需要单独处理。
 
400、500
1、400 Bad Request客户端请求有语法错误,不能被服务器所 请求有语法错误,不能被服务器所理解
2、401 Unauthorized请求未经授权,这个状态代码必须和 WWW-Authenticate报头域一起使用
3、403 Forbidden服务器收到请求,但是拒绝提供 服务
4、404 Not Found请求资源不存在, eg :输入了错误的URL
5、 500 Internal Server Error服务器 发生不可预期的错误
6、503 Server Unavailable服务器当前不能处理客户端的请求,一段时间后可能恢复正常
 
错误处理
1、400 Bad Request 检查请求的参数或者路径
2、401 Unauthorized如果需要授权的网页,尝试重新登录
3、403 ForbiddenForbidden Forbidden
(1)如果是需要登录的网站,尝试重新登录
(2)IP 被封,暂停爬取并增加虫的等待时间,如果拨号网络尝试重新联网更改 IP
4、404 Not Found 直接丢弃
6、5XX 服务器错误, 直接丢弃,并计数,如果连续不成功,WARNING并停止爬取
 
(五)、HTML及CSS


image.png


image.png


HTML 超文本标记语言,简单来说可以认为一种规范或者协议浏 览器根据HTML的语言规范来解析
HTML里与爬虫相关的规范有以下:
这一类 tagtag 标记了外链用来做抓取,而 tr 、p用来进行内容抽取
• Tag:


id 、class 用在 css 上的,能帮助我们定位元素,作用于tr p 类似:
• Class: class=“home -price”
• Id: id=‘price -frame’ 
 
(六)、DOM树




(七)、Javascript
Javascript就是运行在前端的编程语言,最典型用动态网页数据、内容加载及呈现上, javascript做网络请求的时候最常用技术成为AJAX(Asynchronous JavaScript and XML),专门用来异步请求数据,这些是我们抓取的时候需要用到的。
 
二、宽度及深度抓取
(一)、网页抓取原理

image.png


(二)、爬虫的抓取对象类型
1、静态网页
2、动态网页
3、Web Service
(三)、深度优先策略


image.png


 
(四)、宽度优先策略


image.png


 
(五)、选择哪种策略
1、重要的网页距离种子站点比较近
2、 万维网的深度并没有很,一个页多路径可以到达 
3、 宽度优先有利于多爬虫并行合作抓取
4、深度限制于宽度优先相结合
 
三、不重复抓取策略
(一)、如何记录抓取历史
1. 将访问过的URL保存到数据库效率太低
2. 用HashSet HashSet 将访问过的 URL 保存起来。那只需接近 O(1)的代价就可以查到一个 URL是否被访问过了。 消耗内存
3. URL 经过 MD5 或SHA -1等单向哈希后再保存到 HashSet 或数据库。
4. Bit-Map方法。建立一个 BitSet ,将每个 URL 经过一个哈希函数映射到某一位。
(二)、MD5函数
MD5 签名是一个哈希函数,可以将任意长度的据量转换为固定长度数字,(通常是 4个整型, 128 位)。计算机不可能有 2的128 那么大内存,因此实际的哈 希表都会是 URL.MD5再%n (即取模)。现实世界的URL组合必然超越哈希表的槽位数,因此碰撞是一定存在的,一般的Hash函数,例如Java的HashTable是一 个HASH 表再跟上一个链表,链表里存的是碰撞的结果。

image.png


(三)、提高效率
1、评估网站的页数量
2、选择合适的 HASH 算法和空间阈值, 降低碰撞几率
3、选择合适的存储结构和算法
(四)、评估网页数量
site:网址
(五)、BITMAP方式记录
将URL的MD5值再次哈希,用一个或多BIT位来记录一个URL :
1. 确定空间大小 e.g.  facebook 1.5Gb
2. 按倍增加槽位 e.g. 16GB
3. HASH算法映射 ( murmurhash3, cityhash)Python: mmh3 bitarray
 
pip install murmurhash3 bitarray


image.png



• 优势:对存储进行了进一步压缩,在 MD5 的基础上,可以从 128 位最多压缩到 1位,一般情况如果用 4bit或者 8bit表示一个 url ,也能压缩 32 或者 16 倍
• 缺陷 :碰撞概率增加
(六)、Bloom Filter 
Bloom Filter使用了多个哈希函数,而不是一个。 创建一个 m位BitSet,先将所有位初始化为 0,然后选择 k个不同的哈希函数。第 i个哈希函数对字符串str哈希的结果记为 h(i,str ),且 h(i,str )的范围是 0到m-1。
只能插入,不能删除!!


image.png


(七)、pybloomfilter
安装
pip install pybloomfilter(可能运行时会 crash crash )
git clone https://github.com/axiak/pybloomfiltermmap.git 
python setup.py install
构造函数
class pybloomfilter.BloomFilter(capacity : int, error_rate:float[,filename=None:String][, perm=0755 ])
并不实际检查容量,如果需要比较低的error_rate,则需要设置更大的容量


image.png



官方文档
https://media.readthedocs.org/pdf/pybloomfiltermmap3/latest/pybloomfiltermmap3.pdf 
 
(八)、如何有效记录抓取历史
1、多数情况下不需要压缩,尤其网页量少的
2、网页数量大的情况下,使用 Bloom Filter压缩
3、重点是计算碰撞概率,并根据来确定存储空间的阈值
4、分布式系统、将散列映射到多台主机的内存
 
四、网站结构分析
1、网站对爬虫的限制
2、利用sitemap来分析网站结构和估算目标网页的规模
3、有效率抓取特定内容
      利用sitemap里的信息,直接对网页.html进行抓取
4、对网站目录结构进行分析
大多数网站都会存在明确的 toptodown 的分类目录结构,我们可以进入特定行抓取
对于 www.mafengwo.cn这个网站,所有旅游的记都位于 www.mafengwo.cn/mdd下,按照城市进 行了分类,每个城市的游记位于首页。
城市的首页: /travel-scenic scenic-spot/mafengwo/10774 .html
游记的分页格式: /yj /10774/1-0-01 .html
游记的页面: /i/3523364.html