Scrapy
Published:
爬虫学习笔记
Chapter 1. Scrapy简介
scrapy优势:
- 可以并行运行多个请求,并且通过单一线程来管理他们。
- 可以直接使用beautiful soup、lxml,以及selectors,更高效地处理残缺的代码和编码
- 只需编写爬虫和管道等少数模块
- 可以同mysql、redis和elasticsearch等服务链接起来
需要规避的事情:
- 避免DoS(拒绝服务)攻击的行为,如果发现响应时间增加了,就应该降低爬虫的强度
- 侵犯版权(肖像权等)
在请求中,有一个User-Agent字段,让网站管理员知道你是谁,用数据做什么。如果User-Agent是一个URL或者应用名称,那么网站管理员可以访问站点,了解你是如何使用数据的。
Chapter 2. 理解HTML和XPath
域名系统:在网络上定位合适的服务器
可以通过“查看页面源代码”看到与其相关的HTML文件(Mac可以使用Cmd+U快捷键)。源代码中的尖括号部分的内容(例如:<p>)称为标签。一对标签(例如:<p>与</p>)中的内容被称为HTML元素。如果一个标签中有别的键值对(例如:href=”“),则键值对被称为属性。
唯一可见的是body元素中的内容。
XPath:选择并抽取元素、属性和文本。
在Chrome页面上右键点击【检查】,即可进入控制台,使用【$x】工具
XPath表达式中的双斜线【//a】表示获取所有该目录下的a元素,无论其在哪个层次; 单斜线【/a】仅获得该目录直接下级的a元素
访问属性时,使用@符号:【//a/@href】即为获得所有a标签中的href属性值。
【//a[@href]】可以获得包含href属性的所有a标签。
若某个标签下的内容很多,比如【//img】下有很多图片,则可以用数组的形式索引(注意,索引从1开始),例如【//img[1]】
为了使XPath更鲁棒,遵守几点规则:
- 避免使用数组索引【解决方法:找其上级的id或class属性】
- 避免使用经常更换的class【解决方法:识别出与CSS相关的class,尽可能不使用它】
- 尽可能使用ID属性
- 尽可能使用面向数据内容的class,例如class=departure-time
Chapter 3. 爬虫基础
\(UR^2IM\) 流程:
- 获取URL
- 请求(Request)
- 响应(Response)
- Item
- 更多的URL
除非设置一个用户代理头USER_AGENT,否则网站不会回应请求。
scrapy shell: 调试的工具,默认执行了一个GET请求:
scrapy shell -s USER_AGENT="<user_agent>" <url>
在调试的过程中,可以通过ctrl+D退出。 调试的输出在【Available Scrapy objects】下,包含下列对象,并可在shell中直接调用:
- crawler
- item
- request
- response:此处可以直接查看GET的状态码,如果状态码为200则页面信息加载成功。
- settings
- spider
可以通过response.xpath().extract()或者response.xpath().re()的方法提取出所需的文本列表。
要创建一个项目,可以使用下列命令:
scrapy startproject <projectname>
在Item类中,可以添加一些字段,首先导入Item和Field两个类,每个字段用Field类初始化。
from scrapy.item import Item, Field
class MyItem(scrapy.Item)
title = Field()