Alan Hou的个人博客

【Python开发】利用Scrapy开发爬虫

【Python开发】利用Scrapy开发爬虫

虚拟环境的搭建可参见Django环境搭建及开发

正则表达式知识参见【转载】Python正则表达式指南

正则表达式中匹配中文

前置知识

技术选型(Scrapy vs. Requests+BeautifulSoup

1、Requests 和 BeautifulSoup 都是库,Scrapy 是框架

2、Scrapy 框架中可以加入 Requests 和 BeautifulSoup

3、Scrapy 基于 Twisted,性能是最大的优势

4、Scrapy 方便扩展,提供了很多内置的功能

5、Scrapy 内置的 CSS 和 XPath Selector 非常方便,BeautifulSoup 最大的缺点就是慢

爬虫的作用

1、搜索引擎—百度、Google、垂直领域搜索引擎

2、推荐引擎—今日头条

3、机器学习的数据样本

4、数据分析(如金融数据分析、舆情分析等)

深度优先和广度优先

深度优先:ABDEICFGH(递归实现、Scrapy默认)
广度优先:ABCDEFGHI(队列实现)

代码演示深度优先

代码演示广度优先

爬虫去重策略

1、将访问过的 url 保存到数据库中

2、将访问过的 url 保存到 set中,只需 o(1)的代价就可以查询 url

100,000,000*2byte*50个字符/1024/1024/1024 = 9G (假定每个 url是50个字符,可看到缺点是占用内存较高)

3、url 经过 MD5等方法哈希后保存到 set 中(Scrapy 默认使用方法)

4、用 bitmap 方法,将访问过的 url 通过 hash函数映射到某一位(缺点是冲突较高)

5、BloomFilter 方法对 bitmap 进行改进,多重 hash 函数降低冲突

环境准备(Mac)

Windows可下载cmder来使用常用的Linux命令

项目搭建

注:在PyCharm中编写代码时需访问Preferences > Project Interpreter选择所创建的env环境

XPath语法

CSS选择器



扩展知识:采用 Django 的 ORM 存储字段:scrapy-djangoitem

Settings.py

异步数据库存储

使用 Item Loader

IP代理

西刺免费IP代理

scrapy-proxies

scrapy-crawlera (官方收费)

TOR

验证码

编码实现(tesseract-ocr):识别率低

云打码(如http://yundama.com/)

在线打码

Selenium

Selenium安装方法及 Driver

Chomedriver完整版本下载:http://chromedriver.chromium.org/downloads

很多网站对于 Selenium都有相应的检测,执行以下操作可进行一定程度的防止:

1、去除 cdc 检查(以下 chg为随机选择的字符串):

2、 设置为开发者模式,防止被各大网站通过console 中打印windows.navigator.webdriver为 True识别出使用了Selenium

3、直接使用老版本 Chrome(60)+Chromedriver(2.33)

4、使用命令行打开 Chrome(需关闭已打开的 Chrome)

清除 input中的内容

网上有大量的用户反馈 Selenium 的 clear 方法是无法使用的,因此产生了很多替代方法,如使用 send_keys(Keys.CONTROL + “a”)先让其全选再输入,但对应的将其修改为 COMMAND 在 Mac 上亲测并不可用。

甚至 GitHub 上还有说获取其中值的长度再执行Keys.BACKSPACE或 Keys.DELETE,这里测试点击事件接 这两者均未见效果,到是Keys.ARROW_LEFT可以使用,因此如果获取长度再执行向左方向键似乎也是一种方案。

最终 Alan 选择的是通过双击事件进行全选,相关代码片断如下:

鼠标点击模拟

MacOS 上捕捉屏幕上的坐标位置直接使用 Cmd+Shift+4即可

Linux上无图形界面使用浏览器的解决方案

PhantomJS, Scrapy Splash, Selenium Grid

Elasticsearch

Elasticsearch, Solr, Sphinx

关系型数据库搜索缺点

  1. 无法打分
  2. 无分布式
  3. 无法解析搜索请求
  4. 效率低
  5. 分词

安装elasticsearch-rtf(已安装各种插件的版本)

https://github.com/medcl/elasticsearch-rtf

https://elasticsearch.cn/article/6149

打分技术 TF-IDF

head 插件和 Kibana的安装

https://github.com/mobz/elasticsearch-head

连接需先配置 Elaticsearch(config/elasticsearch.yml)允许外部访问

Kibana 应注意与 Elasticsearch 版本需要匹配

将 Scrapy 数据导致 Elasticsearch

https://github.com/elastic/elasticsearch-dsl-py

Completion Suggester 自动补全接口

部署 Scrapy: https://github.com/scrapy/scrapyd

常见问题

1.libxml2.2.dylib provides version 10.0.0

2.ImportError No module named ‘win32api’

3.ImportError: No module named ‘_sqlite3’
方法一:使用homebrew安装或升级python到3.6版本: brew install python3

方法二:使用anaconda新建环境, 点此参考
4.ValueError: Missing scheme in request url: h

此处是由于默认会将IMAGES_URLS_FIELD配置的图片链接作为数组来处理,因此将传入的值改成数组即可,如

5.TypeError: Unicode-objects must be encoded before hashing
对相应的值进行编码

6.Scrapy shell如何添加headers
当前很多网站都在反爬机制,其中一个就是对header进行判断,那么使用Scrapy Shell时要如何添加header信息呢?

7. User Agent

8. no module named win32API

退出移动版