Chapter I 简介

为什么要写爬虫?

  1. 每个网站都应该提供 API,然而这是不可能的
  2. 即使提供了 API,往往也会限速,不如自己找接口

注意已知条件(robots.txt 和 sitemap.xml)

  1. robots.txt 中可能会有陷阱
  2. sitemap 中可能提供了重要的链接

估算网站的大小

一个简便方法是使用 site:example.com 查询,然而这种方法对于大战不适用

识别网站所使用的技术

  1. builtwith 模块

    pip install builtwith

    builtwith.parse(url) # returns a dict

  2. python-whois 模块

    pip install python-whois

    import whois

    whois.whois(url)

下载器

下载器需要提供的几个功能:

  1. 错误重试,仅当返回的错误为500的时候重试,一般400错误可认为不可恢复的网页
  2. 伪装 UA
  3. 策略

    a. 爬取站点地图 sitemap

    b. 通过 ID 遍历爬取

    i. ID 可能不是连续的,比如某条记录被删除了

    ii. ID 访问失效 n 次以后可以认为遍历完全了
  4. 相对连接转化,这点可以利用 lxml 的 make_link_absolute 函数
  5. 处理 robots.txt 可以利用标准库的 robotsparser 模块

    import robotsparser

    rp = robotparser.RobotFileParser

    rp.set_url('path_to_robots.txt')

    rp.read()

    rp.can_fetch("UA", "url")

    True or False
  6. 支持代理
  7. 下载限速,粒度应该精确到每一个站点比较好
  8. 避免爬虫陷阱,尤其是最后一页自身引用自身的例子

    a. 记录链接深度

例子:https://bitbucket.org/wswp/code/src/chpter01/link_crawler3.py

Chapter II 数据抓取

抽取资源的方式

  1. 正则

    不适用于匹配网页结构,因为网页结构中空白等都是无关紧要的,而可能破坏正则 Structural-based

    适用于数据本身符合某种模式,比如 IP 地址,比如日期等 Content-based
  2. xpath 与 CSS

    适用于匹配网页的结构信息 Strctual-based,lxml 的 CSS 选择器在内部是转换为 xpath 实现的,css 远不如 xpath 灵活
  3. BeautifulSoup, 慢,从来没有在生产代码中见到过

下载的第二步,就是把获得的网页传递给 Extractor 来提取内容,可以通过传递给下载函数回调来处理,但是这种耦合性太强了

Chapter III 下载缓存

书中的缓存把所有相应都做了缓存,包括500的错误响应,实际上这样的直接不缓存好了。。

书中的磁盘缓存把 url normalize 逻辑也加到了这里,感觉比较混乱

注意使用磁盘文件缓存的话会受限于磁盘单目录文件的数量,即使是 ext4 文件系统也不大

Chapter IV 并发下载

执行下载时间估算也是很重要的,每个链接下载需要多长时间,整个过程需要多长时间

多线程的下载例子,手工模拟线程池

def process_queue(q):
pass threads = []
while thread or crawl_queue:
for thread in threads:
if not threads.is_alive(): threads.remove(thread)
while len(threads) < max_threads and crawl_queue:
thread = threading.Thread(target=process_queue, daemon=True)
thread.start()
threads.append(thread)
time.sleep(some_time)

性能的增长与线程和进程的数量并不是成线性比例的,而是对数比例,因为切换要花费一定的时间,再者最终是受限于带宽的

Chapter V 动态内容

逆向接口

依赖于 Ajax 的网站看起来更复杂,但是实际上因为数据和表现层的分离会更简单,但是如果逆向工程也不好得到通用的方法,如何构建一个辅助工具呢?

表示出网页上哪些地方是动态加载的,列出 js 全局变量,列出可能的 jsonp 请求

利用 Ajax 接口时,可以利用各种边界情况,比如把搜索条件置为空,置为 *,置为 .

渲染动态网页

使用Qt

使用 Selenium 或者 PhantomJS,这时附加 Cookie 等都是很严重的问题

Chapter VI 表单交互

登录表单中往往会有隐藏的参数,比如 form_key 用于避免表单重复提交,还可能需要 cookie 验证

Wow,竟然可以直接从浏览器加载 Cookie,使用 browsercookie 模块

Chapter VII 验证码处理

使用机器识别验证码

使用 Pillow 和 pytesseract 识别验证码,但是 tessact 本不是用来识别验证码的

一种锐化方法

img.convert('L')
img.point(lambda x: 0 if x < 1 else 255, 'l')
tessact.image_to_string(img)

还可以通过限定字符集提高识别率

还可以使用人工打码平台

用 Python 编写网络爬虫 笔记的更多相关文章

  1. 利用Python编写网络爬虫下载文章

    #coding: utf-8 #title..href... str0='blabla<a title="<论电影的七个元素>——关于我对电影的一些看法以及<后会无期 ...

  2. 读书笔记汇总 --- 用Python写网络爬虫

    本系列记录并分享:学习利用Python写网络爬虫的过程. 书目信息 Link 书名: 用Python写网络爬虫 作者: [澳]理查德 劳森(Richard Lawson) 原版名称: web scra ...

  3. Python网络爬虫笔记(五):下载、分析京东P20销售数据

    (一)  分析网页 下载下面这个链接的销售数据 https://item.jd.com/6733026.html#comment 1.      翻页的时候,谷歌F12的Network页签可以看到下面 ...

  4. Python即时网络爬虫项目启动说明

    作为酷爱编程的老程序员,实在按耐不下这个冲动,Python真的是太火了,不断撩拨我的心. 我是对Python存有戒备之心的,想当年我基于Drupal做的系统,使用php语言,当语言升级了,推翻了老版本 ...

  5. Python即时网络爬虫:API说明

    API说明——下载gsExtractor内容提取器 1,接口名称 下载内容提取器 2,接口说明 如果您想编写一个网络爬虫程序,您会发现大部分时间耗费在调测网页内容提取规则上,不讲正则表达式的语法如何怪 ...

  6. 用Python写网络爬虫 第二版

    书籍介绍 书名:用 Python 写网络爬虫(第2版) 内容简介:本书包括网络爬虫的定义以及如何爬取网站,如何使用几种库从网页中抽取数据,如何通过缓存结果避免重复下载的问题,如何通过并行下载来加速数据 ...

  7. Java网络爬虫笔记

    Java网络爬虫笔记 HttpClient来代替浏览器发起请求. select找到的是元素,也就是elements,你想要获取具体某一个属性的值,还是要用attr("")方法.标签 ...

  8. Python即时网络爬虫项目: 内容提取器的定义(Python2.7版本)

    1. 项目背景 在Python即时网络爬虫项目启动说明中我们讨论一个数字:程序员浪费在调测内容提取规则上的时间太多了(见上图),从而我们发起了这个项目,把程序员从繁琐的调测规则中解放出来,投入到更高端 ...

  9. Python即时网络爬虫项目: 内容提取器的定义

    1. 项目背景 在python 即时网络爬虫项目启动说明中我们讨论一个数字:程序员浪费在调测内容提取规则上的时间,从而我们发起了这个项目,把程序员从繁琐的调测规则中解放出来,投入到更高端的数据处理工作 ...

随机推荐

  1. Django中使用CKEditor代码高亮显示插件Code Snippet

    Django使用CKEditor可以安装django-ckeditor这个模块,具体步骤可按照这里进行:http://www.nanerbang.com/article/2/ 我在富文本编辑器中想使用 ...

  2. ORM映射设计思想

    using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; usin ...

  3. RecyclerView 设置item间隔的方法

    RecyclerView大家常用,但是如何给加载出来的item增加间隔很多人都不知道,下面是方法,直接上代码了: LinearLayoutManager layoutManager = new Lin ...

  4. 使用spring webflow,在前台页面中如何显示后端返回的错误信息

    刚刚接触spring webflow,相关的资料并不是很多,并且大都是那种入门的 .xml文件的配置. 用到的CAS 最新的4.0版本用的就是web-flow流,前台页面使用的是表单提交.于是我就碰到 ...

  5. windows和linux删除文件方法

    Windows下bat文件内容如下:复制代码 代码如下: @echo offforfiles -p "D:\servers\apache2.2\logs" -s -m *.log ...

  6. CDMA sid, nid, bid 含义解释

    copyright@ celldb.cc SID 是系统识别码,每个地级市只有一个sid,是唯一的. NID是网络识别码,由各本地网管理,也就是由地级分公司分配.每个地级市可能有1到3个nid. BI ...

  7. Tcl与Design Compiler (九)——综合后的形式验证

    本文属于原创手打(有参考文献),如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/  ,作者:IC_learner 这里来讲一下forma ...

  8. SearchBar简单展示

    import UIKit class SearchViewController: UIViewController,UISearchBarDelegate { let SCREEN_WIDTH = U ...

  9. PyQt通过resize改变窗体大小时ListWidget显示异常

    前几天开始的pygame音乐播放器Doco,做的差不多了,上午做到了歌词显示和搜索页面.遇到bug,即通过resize改变ui大小时ListWidget显示异常 #目的: 增加一部分窗口用来显示歌词和 ...

  10. Java--JDBC连接数据库

         我们知道Java中的jdbc是用来连接应用程序和数据系统的,本篇文章主要就来看看关于JDBC的实现和使用细节.主要包含以下几点内容: JDBC的基本知识(数据驱动程序) JDBC的连接配置 ...