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. jQuery kxbdMarquee 无缝滚动

    转:http://code.ciaoca.com/jquery/kxbdmarquee/ <marquee> 曾是 IE 下独有的一个走马灯效果的标签,其他浏览器并不兼容,于是出现了使用 ...

  2. 项目中使用emoji表情包与表情的解析过程详情

    菜鸡一只,刚开始写博客文笔不好,有问题欢迎相互讨论.闲话不多说. 用到了三个插件 Emoji Picker 第一步 这个emoji表情包插件是我找到比较好 的一个,input框中是不能放入图片的,效果 ...

  3. 解决使用JavaScriptConvert转换对象为Json时,中文和&符号被转码的问题

    描述:比如 对象为var data=new {url="http://www.baidu.com?a=b&c=d"} 使用JavaScriptConvert序列化为JSON ...

  4. 让CEF支持FLASH(非安装插件的形式)

    测试环境: CEF3 + CefGlue 下载FLASH的NPAPI DLL文件 , 在CEF目录下新建文件夹plugins,然后把DLL文件放进去即可. 据说下面是PPAPI的方式,未测试 启动的时 ...

  5. Eclipse集成Tomcat教程

    (初学者都会问一个问题,就是Eclipse好用还是Myeclipse好用.好吧,这个问题我昨晚才刚刚问完,哈哈,因为我一开始学Java都是直接下了一个MyeClipse来用的,没想过太多.其实也是,两 ...

  6. 兔子生娃问题---函数递归应用--c语言实现

    事情是这样的:在很久很久以前....有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 兔子的规律为数列:1, 1 ...

  7. ios微信自动播放音乐

    <!DOCTYPE html> <html> <head lang="en">     <meta charset="UTF-8 ...

  8. Jmeter-测试计划元件

    打开Jmeter页面,默认显示测试计划和工作台: 1.测试计划: 用来描述一个性能测试,包含与本次性能测试所有相关的功能.也就说性能测试的所有内容是于基于一个计划的. 右键单击"测试计划&q ...

  9. nginx 入门配置

    这个星期公司的定期分享内容是Nginx,于是就要写作业了. 一.动静分离 1.下载Windows 版本的Nginx,解压,放到C盘下.进入目录,然后按然shift键右键,打开命令行,输入: start ...

  10. linuxCentOs6前期简单且必要的设置

    1.修改主机名 Sudo vi /etc/sysconfig/network(需要重启) Hostname master (不需要重启,设置当前主机名为master) Hostname查看当前主机名 ...