爬虫基础知识点汇总(html文件基础和4个常用库 超级详细长文预警)
爬虫基础知识点汇总(内含HTML文件基础、Selenium库、Request库、BeautifulSoup库和Scrapy库)
10000+字长文预警!!! 知识点详细丰富
(ps:作为一名爬虫半年的小白,在学习爬虫期间基本90%以上的问题都能CSDN上找到答案,CSDN真是我的生命源泉哈哈哈;现在我也掌握了一些基础的爬虫要点,想要分享给新入坑的同学,让大家少走一些弯路~)
本知识点汇总从HTML文件基础、Selenium库、Request库、BeautifulSoup库和Scrapy库五个方面论述,五个方面以大标题的形式展现,并在每个标题后面附有思路论述图。
一、HTML文件基础
超文本标记语言(缩写HTML,全称是HyperText Mark-up Language),是迄今为止网络上应用最为广泛的语言,也是构成网页文档的主要语言。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字、图形、动画、声音、表格、链接等。HTML的结构包括头部(Head)、主体(Body)两大部分,其中头部描述浏览器所需的信息,而主体则包含所要说明的具体内容。
HTML元素由开始标签和结束标签组成。标签的标准格式有两种,一种是单标记,一种是双标记,双标记有一对开始和结束,而单标记只有一个开始标签如。一般标签名推荐用小写,标签具有属性,属性用来表示标签的特征。
例如:
这是一个段落
<img src=" 这里表示图片的路径 " />
1.基本结构
HTML文档的基本结构包括三部分,除了上面提到的头部和主体,还包括起始标记。第一,html是网页的起始标签,也称为根标签,所有的网页标签都在html标签中;第二,head 标签用于定义文档的头部,它是所有头部元素的容器。头部元素有title、script、 style、link、 meta等标签;第三,在body标签之间的内容是网页的主要内容,如h1、p、a等网页内容标签,在这里的标签中的内容会在浏览器中显示出来。
这里着重对网页的头部标签进行介绍,因为头部标签规定了网页的各种基本信息,在我们用爬虫爬取信息时也会经常寻找、修改头部中的信息。HTML的头部元素是以head为开始标记,以/head为结束标记。它用于包含当前文档的相关信息,可包含title元素、meta元素等,分别用来定义页面的标题、编码。使用head元素可以将基本信息部分和页面主体内容区分开来。页面标题元素title,一般是用来说明页面用途的,它显示在浏览器的标题栏中。在HTML文档中,标题信息设置在页面的头部,也就是head标签之间。页面信息元素:meta,一般用来定义页面的附加信息,其中包括页面的作者、版权、关键字等相关信息。meta标记又包括name、content和http-equiv等信息的定义,name属性用来制定文档中附加信息的名称,content属性用来指定文档中附加信息的值,http-equiv属性和name属性类似,用来指定附加信息的名称。在浏览器加载页面之前,服务器会把http-equiv属性定义的相关信息发送给浏览器,便于在浏览器中正确显示页面。
2.超链接标记a
a标签定义超链接,用于从一张页面链接到另一张页面,正是因为超链接的存在,HTML语言称得上是超文本标记语言。a 元素最重要的属性是href属性,它指示链接的目标或页面的 URL,可以链接https和http地址、自定义的page,对象(如图片)、用#伪链接等。target规定在何处打开链接文档,它有五个选项:_blank:在新窗口中打开被链接文档,_self:默认。在相同的框架中打开被链接文档;_parent:在父框架集中打开被链接文档,_top:在整个窗口中打开被链接文档,framename:在指定的框架中打开被链接文档。name规定锚的名称。我们在编写爬虫时,常常需要获得a标签中的URL链接或者构造URL爬取列表,这就需要用到它的href属性。
3.css选择器
层叠样式表(全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。CSS 能够对网页中元素位置的排版进行像素级精确控制,拥有对网页对象和模型样式编辑的能力。
用css对网页元素修饰布局时,有行内样式,内部样式表和外部样式表三种。目前,外部样式表写法最流行,处理效率最高;但从优先级上说,行内样式内部样式表外部样式表。我们分析网页结构时就可以用这种方式将真正作用的属性和对象匹配起来。Css功能强大,可以为元素设置font、background、border、margin、padding、text-align等等属性,但当同一种标签重复出现时,只用标签名无法确定该元素的身份,所以css用选择器来定位标签。
①ID选择器:优先级最高,页面中不能有相同id出现。命名规则是以字母、下划线开头,不能以数字开头。在所要设置的标签中加入属性id=“n”。
②类选择器:优先级仅次于id选择器。在一个页面中可以有多个相同的类名。不能以数字开头,在所要设置的标签中加入class=“n”。
③标签名选择器:同时控制同一标签。
④群组选择器:把几个id,class名相同的取出来,写在一起,中间用英文状态下的逗号隔开。
⑤后代选择器又称为包含选择器,用来选择元素或元素组的后代,其写法就是把外层标签写在前面,内层标签写在后面,中间用空格分隔。当标签发生嵌套时,内层标签就成为外层标签的后代。
⑥子元素选择器只能选择作为某元素子元素的元素。其写法就是把父级标签写在前面,子级标签写在后面,中间跟一个 进行连接,符号左右两侧需要各保留一个空格。这里的子指的伪类选择器,用 2个点,就是冒号。比如 :link{}儿子,不包含孙子、重孙子之类。
⑦并集选择器(CSS选择器分组)是各个选择器通过逗号连接而成的,任何形式的选择器(包括标签选择器、class类选择器id选择器等),都可以作为并集选择器的一部分。如果某些选择器定义的样式完全相同,或部分相同,就可以利用并集选择器为它们定义相同的CSS样式。
4.Xpath选择器
XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点,提供在数据结构树中找寻节点的能力。
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。路径表达式是从一个XML节点(当前的上下文节点)到另一个节点、或一组节点的书面步骤顺序,这些步骤以"/"字符分开。在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。父(Parent),每个元素以及属性都有一个父。子(Children),元素节点可有零个、一个或多个子。
同胞(Sibling),拥有相同的父节点。先辈(Ancestor),某节点的父、父的父等等。后代(Descendant),某个节点的子,子的子等等。通过对xpath节点轴的选择,100多个函数的调用,运算符的使用,我们做爬虫时用xpath也可以容易的定位到想要爬取的内容。
5.HTML文档常用标记
通过了解HTML文档的常用标记,使我们能更快更准的分析网页结构,从而编写出正确的爬虫框架和高效的爬取方法。
标签 | 含义 |
---|---|
h1…/h1 | 标题字大小(h1~h6) |
p····/p | 段落 |
ul…/ul | 无序列表 |
ol…/ol | 有序列表 |
li·····/li | 列表项目 |
a href=”…”…/a | 超链接 |
font | 字体 |
sub | 下标 |
sup | 上标 |
br | 换行 |
img src=’”…”/ | 图像定义 |
hr | 水平线 |
del | 删除线 |
frame | 框架集的窗口和框架 |
二、Selenium库
Selenium 是一个用于Web应用程序测试的工具,支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性,即测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。Selenium支持自动录制动作和自动生成,Net、Java、Perl等不同语言的测试脚本。支持多种操作系统如Windows、Linux、IOS、Android等。Selenium3.x调用浏览器必须有一个webdriver驱动文件,然后配置浏览器的环境变量。
1.Selenium提供了以下8种定位元素的方式
定位一个元素 | 定位多个元素 | 含义 |
---|---|---|
find_element_by_id | find_elements_by_id | 通过元素id定位 |
find_element_by_name | find_elements_by_name | 通过元素name定位 |
find_element_by_xpath | find_elements_by_xpath | 通过xpath表达式定位 |
find_element_by_link_text | find_elements_by_link_tex | 通过完整超链接定位 |
find_element_by_partial_link_text | find_elements_by_partial_link_text | 通过部分链接定位 |
find_element_by_tag_name | find_elements_by_tag_name | 通过标签定位 |
find_element_by_class_name | find_elements_by_class_name | 通过类名进行定位 |
find_element_by_css_selector | find_elements_by_css_selector | 通过css选择器进行定位 |
举例说明如:
通过id定位,dr.find_element_by_id(“kw”);
通过name定位,dr.find_element_by_name(“wd”);
通过xpath定位,dr.find_element_by_xpath("/html/body/form/span/input");
通过css定位,dr.find_element_by_css_selector("[name=wd]")等等。
2.控制浏览器的操作
从selenium库中可以导入webdriver来控制浏览器的操作,下面是一些操作方法
方法 | 说明 |
---|---|
set_window_size() | 设置浏览器的大小 |
back() | 控制浏览器后退 |
forward() | 控制浏览器前进 |
refresh() | 刷新当前页面 |
clear() | 清除文本 |
send_keys (value) | 模拟按键输入 |
click() | 单击元素 |
submit() | 用于提交表单 |
get_attribute(name) | 获取元素属性值 |
is_displayed() | 设置该元素是否用户可见 |
size | 返回元素的尺寸 |
text | 获取元素的文本 |
举例说明如:
刷新浏览器,browser.refresh();
设置浏览器的窗口大小,browser.set_window_size(1400,800);
设置链接内容,browser.find_element_by_link_text(“新闻”).click()等。
3.鼠标事件
在 WebDriver 中,将关于鼠标操作的方法封装在 ActionChains 类中,下面是webdriver中的鼠标事件。
方法 | 说明 |
---|---|
ActionChains(driver) | 构造ActionChains对象 |
context_click() | 执行鼠标悬停操作 |
move_to_element(above) | 右击 |
double_click() | 双击 |
drag_and_drop() | 拖动 |
move_to_element(above) | 执行鼠标悬停操作 |
context_click() | 用于模拟鼠标右键操作, 在调用时需要指定元素定位 |
perform() | 执行所有 ActionChains 中存储的行为,可以理解成是对整个操作的提交动作 |
举例说明如:
定位到要悬停的元素,
element= driver.find_element_by_link_text(“设置”);
对定位到的元素执行鼠标悬停操作,ActionChains(driver).move_to_element(element).perform()等等。
4.模拟键盘操作
Selenium中的Key模块供了模拟键盘按键的方法,即send_keys()方法。它不仅可以模拟键盘输入,也可以模拟键盘的操作,下面是selenium的常用的模拟键盘操作
模拟键盘按键 | 说明 |
---|---|
send_keys(Keys.BACK_SPACE) | 删除键(BackSpace) |
send_keys(Keys.SPACE) | 空格键(Space) |
send_keys(Keys.TAB) | 制表键(Tab) |
send_keys(Keys.ESCAPE) | 回退键(Esc) |
send_keys(Keys.ENTER) | 回车键(Enter) |
5.断言属性和说明
我们使用selenium库时,不管是在做功能测试还是自动化测试,最后一步需要拿实际结果与预期进行比较。这个比较的称之为断言。通过我们获取title 、URL和text等信息进行断言,下面是获取的断言的属性和说明
属性 | 说明 |
---|---|
title | 用于获得当前页面的标题 |
current_url | 用户获得当前页面的URL |
text | 获取搜索条目的文本信息 |
举例说明如:
获取结果数目,user = driver.find_element_by_class_name(‘nums’).text。
定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词element后面多了一个s表示复数。
举例如:
定位一组元素,elements = driver.find_elements_by_xpath(’//div/h3/a’),然后可以用for循环遍历出每一条搜索结果的标题。
6.警告框处理
在WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单,具体做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ send_keys等方法进行操作,下面是webdriver中的警告框处理
方法 | 说明 |
---|---|
text | 返回 alert/confirm/prompt 中的文字信息 |
accept() | 接受现有警告框 |
dismiss() | 解散现有警告框 |
send_keys(keysToSend) | 发送文本至警告框。keysToSend:将文本发送至警告框。 |
7.下拉框操作
利用selenium爬取网页信息时,有时我们会碰到下拉框,我们要选择下拉框选择操作,导入选择下拉框Select类,使用该类处理下拉框操作,下面是select类的方法
方法 | 说明 |
---|---|
select_by_value(“选择值”) | select标签的value属性的值 |
select_by_index(“索引值”) | 下拉框的索引 |
select_by_visible_testx(“文本值”) | 下拉框的文本值 |
8.cookie操作
在爬取网页时,有时候我们需要验证浏览器中cookie是否正确,因为基于真实cookie的测试是无法通过白盒和集成测试进行的。WebDriver提供了操作Cookie的相关方法,可以读取、添加和删除cookie信息,下面是WebDriver操作cookie的方法
方法 | 说明 |
---|---|
get_cookies() | 获得所有cookie信息 |
get_cookie(name) | 返回字典的key为“name”的cookie信息 |
add_cookie(cookie_dict) | 添加cookie。“cookie_dict”指字典对象,必须有name 和value 值 |
delete_cookie(name,optionsString) | 删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域” |
delete_all_cookies() | 删除所有cookie信息 |
9.滚动条设置
JavaScript来控制浏览器的滚动条。WebDriver提供了execute_script()方法来执行JavaScript代码。window.scrollTo()方法用于设置浏览器窗口滚动条的水平和垂直位置。方法的第一个参数表示水平的左间距,第二个参数表示垂直的上边距。其代码如下,js="window.scrollTo(100,450);"driver.execute_script(js)。
10.关闭浏览器窗口
WebDriver还提供了close()方法,用来关闭当前窗口。对于多窗口的处理,我们就要用到close()方法进行关闭了,下面是关闭浏览器窗口的方法
方法 | 说明 |
---|---|
close() | 关闭单个窗口 |
quit() | 关闭所有窗口 |
三、Requests库
Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库,完全满足HTTP测试的要求。http即超文本传输协议,是基于一个“请求与响应”模式的,无状态的应用层协议。它采用url作为定位网络资源的标识符,url格式如下:
http | //host[:port][path] |
---|---|
host | 主机域名或ip地址 |
Port | 端口号,默认80 |
Path | 请求资源的路径 |
1.requests库的七个方法
方法 | 说明 |
---|---|
requests.request() | 构造一个请求,支撑以下各方法的基础方法 |
requests.get() | 获取HTML网页的主要方法,对应于HTTP的GET |
requests.head() | 获取HTML网页头信息的方法,对应于HTTP的HEAD |
requests.post() | 向HTML网页提交POST请求的方法,对应于HTTP的POST |
requests.put() | 向HTML网页提交PUT请求的方法,对应于HTTP的PUT |
requests.patch() | 向HTML网页提交局部修改请求,对应于HTTP的PATCH |
requests.delete() | 向HTML页面提交删除请求,对应于HTTP的DELETE |
2. 13个参数的形式和描述
每个方法里都包含两个以上的参数,有的是默认参数不需要设置,有的参数需要手动设置。Requests库中的控制访问参数一共有13个,下面是13个参数的形式和描述
参数 | 描述 |
---|---|
params | 字典或字节序列,作为参数增加到url中 |
data | 字典,字节薛烈或文件对象,作为request的内容 |
json | json 格式的数据,作为request的内容 |
headers | 字典,http定制头 |
cookies | 字典或cookiejar,request中的cookie |
auth | 元组类型,支持http认证功能 |
files | 字典类型,传输文件 |
timeout | 设定超时时间,秒为单位 |
proxies | 字典类型,设定访问代理服务器,可以增加登录认证 |
allow_redirects | True/False,默认为True,重定向开关 |
stream | True/False,默认为True,获取内容立即下载开关 |
verify | True/False,默认为True,认证ssl证书开关 |
3. 7个属性
使用requests方法后,会返回一个response对象,其存储了服务器响应的内容,response的对象又包括7个属性,下面是response对象的属性和说明
属性 | 说明 |
---|---|
r.status_code | HTTP请求的返回状态,200表示连接成功,404表示失败 |
r.text | HTTP响应内容的字符串形式,即,url对应的页面内容 |
r.encoding | 从HTTP header中猜测的响应内容编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
4.requests库的异常说明
用requests库进行爬虫编写时,常常会遇到特殊的异常情况,我们可以用requests库的异常处理来判断程序是否出现了问题,下面是requests库的异常和说明
异常 | 说明 |
---|---|
requests.ConnectionError | 网络连接错误异常,如DNS查询失败、拒绝连接等 requests.HTTPError |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 连接远程服务器超时异常 |
requests.Timeout | 请求URL超时,产生超时异常 |
r.raise_for_status() | 如果不是200,产生异常requests.HTTPError |
5.爬取的通用框架
我们在用requests爬取网页时,要先获得网页上的内容,再进行下一步的筛选,因此我们一定会用到requests.get()函数,下面给出用requests库爬取网页的通用框架
import requestsdef getHTMLtext(url): try: r=requests.get(url,timeout=30) r.raise_for_status() #如果状态不为200,引发httperror异常 r.encoding=r.apparent_encoding return r.text except: return "产生异常" print(r.text) #即可打印查看爬取到的网页内容(之后还需用BeautifulSoup库解析) (url为想要爬取的网页链接)
四、BeautifulSoup库
BeautifulSoup库是一个解析HTML或XML文件的第三方库。提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档能为用户提供需要抓取的数据。Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。除非文档没有指定一个编码方式,Beautiful Soup就不能自动识别编码方式了但仅仅只需说明一下原始编码方式。
1.支持的解析器
Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,一共提供4种解析器供我们使用。
解析器 | 使用方法 |
---|---|
Python标准库 | BeautifulSoup(markup, “html.parser”) |
lxml HTML解析器 | BeautifulSoup(markup, “lxml”) |
lxml XML解析器 | BeautifulSoup(markup, “xml”) |
html5lib | BeautifulSoup(markup, “html5lib”) |
2.BeautifulSoup类的基本元素
BeautifulSoup解析的文件一般包含三种节点:元素节点 - 通常指HTML 或 XML的标签;文本节点 - 标签内部的文本内容;属性节点 - 每个标签的属性。BeautifulSoup库查找到文档里的一个或多个标签元素,并获取每个标签里的文本和属性。下面介绍BeautifulSoup类的基本元素
基本元素 | 说明 |
---|---|
Tag | 标签,最基本的信息组织单元,分别用和/标明开头和结尾 |
Name | 标签的名字, p … /p 的名字是’p’,格式: tag .name |
Attributes | 标签的属性,字典形式组织,格式: tag .attrs |
NavigableString | 标签内非属性字符串,…/中字符串,格式: tag .string |
Comment | 标签内字符串的注释部分,一种特殊的Comment类型 |
对上面的基本元素举例说明
用 BeautifulSoup 可以很方便地获取Tags,如soup.a;
获取name如 soup.a.name;
获取attributes如soup.p.attrs;
获取NavigableString,如soup.p.string;
Comment 对象是一个特殊类型的NavigableString对象,如type(soup.a.string)
3.find和find_all方法
find(tag, attrs, recursive,string ,**kwargs):获取一个元素,参数的含义见下表
find_all()方法来查找标签元素:.find_all(name, attrs, recursive, string, **kwargs) ,返回一个列表类型,存储查找的所有符合条件的元素
参数 | 说明 |
---|---|
name | 对标签名称的检索字符串 |
attrs | 对标签属性值的检索字符串,可标注属性检索 |
recursive | 是否对子孙全部检索,默认True |
string | …/中字符串区域的检索字符串 |
**kwargs | 控制参数,上面已经提过,不再赘述 |
举例如soup.find_all(id=’link1’),表示查找所有id名为link1的标签,返回一个列表。
4.lambda表达式
soup.findAll(lambda tag: len(tag.attrs)) 获取有两个属性的元素
5.其他节点的获取
获取儿子标签结点、子孙结点:
代码 | 含义 |
---|---|
tag{soup}.children | 迭代类型,儿子标签结点 |
tag{soup}.descendants | 迭代类型,子孙标签结点 |
tag{soup}.contents | 列表类型,儿子标签结点 |
获取父亲结点、祖先结点:
代码 | 含义 |
---|---|
tag.parent | 标签类型,父亲结点 |
tag.parents | 迭代类型,所有的祖先结点 |
获取兄弟节点:
代码 | 含义 |
---|---|
tag.previous_sibling | 标签类型,前一个兄弟结点 |
tag.next_sibling | 标签类型,后一个兄弟结点 |
tag.previous_siblings | 迭代类型,前面所有的兄弟结点 |
tag.next_siblings | 迭代类型,后面所有的兄弟结点 |
举例如for siblings in soup.a.next-siblings,表示循环遍历a标签之后的平行节点(兄弟节点)。
6.css选择器
我们可以利CSS选择器来筛选元素,用到的方法是 soup.select(),返回类型是 list,一般有如下五种方法。
查找方法 | 举例说明 |
---|---|
通过标签名查找 | soup.select(‘title’) |
通过类名查找 | soup.select(’.sister’) |
通过id名查找 | soup.select(’#link1’) |
组合查找 | soup.select(‘p #link1’)(表示查找 p 标签中id 等于 link1的内容) |
属性查找 | soup.select(‘a[href=“http://example.com/elsie”]’) |
以上的 select 方法返回的结果都是列表形式,可但我们以遍历形式输出,用 get_text() 方法来获取它的内容。
7.标准选择器find与select方法的区别
1.find方法返回的是单个元素,find_all方法返回的是一个元素列表,而select方法永远返回的是元素列表。如果使用了select方法查找到了单个元素,要先加列表索引[0],然后才可以调用get_text()方法获取文本。
2.find方法还支持方法参数查询,比select方法更强大。
五、Scrapy库
Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
1.整体架构
Scrapy 使用了 Twisted异步网络库来处理网络通讯,包括了以下组件:
1.引擎(Scrapy),用来处理整个系统的数据流, 触发事务(框架核心)
2.调度器(Scheduler),用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
3.下载器(Downloader),用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
4.爬虫(Spiders),爬虫是主要爬取网页的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。
5.项目管道(Pipeline),负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
6.下载器中间件(Downloader Middlewares),位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
7.爬虫中间件(Spider Middlewares),介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
8.调度中间件(Scheduler Middewares),介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
而我们使用scrapy框架时,由于很多部分已经自动搭建完成,我们一般只需编写spiders里面的内容,编写爬取信息的方式和itempipelines中的内容,编写对采集的数据进行合适的操作,如清理、检验、查重等。编写完这两个主要部分后,根据爬取网页的实际情况对其他部分做细微的修改就完成了。
2.Scrapy的运行流程
1.引擎从调度器中取出一个链接(URL)用于接下来的抓取
2.引擎把URL封装成一个请求(Request)传给下载器
3.下载器把资源下载下来,并封装成应答包(Response)
4.爬虫解析Response,通过engine传给spiders
5.spider如果解析出实体(Item),则交给实体管道进行进一步的处理
6.spider如果解析出的是链接(URL),则把URL交给调度器等待抓取
3.Scrapy的常用命令
命令 | 含义 |
---|---|
scrapy --help | 查看scrapy的基本命令 |
scrapy version -v | 查看scrapy版本和各组件的信息 |
scrapy startproject xx | 创建一个爬虫工程 |
scrapy genspider name site.com | 要进入工程目录下 |
scrapy parse url | 使用固定的parse函数解析某个页面 |
scrapy runspider xx.py | 运行单个爬虫(扩展名后要加.py) |
scrapy crawl name | 运行工程里的爬虫(不用添加文件的扩展名) |
scrapy bench | 检测scrapy是否安装成功 |
scrapy list | 查看工程文件中有多少条爬虫 |
4.Scrapy框架的相关文件说明
scrapy.cfg,项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)
items.py,设置数据存储模板,用于结构化数据,如:Django的Model
Pipelines,数据处理行为,如:一般结构化的数据持久化
settings.py,配置文件,如:递归的层数、并发数,延迟下载等
Spiders,爬虫目录,如:创建文件,编写爬虫规则
5.Scrapy框架常与Yield关键字搭配使用
yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器,也是可迭代对象。当调用这个函数的时候,函数内部的代码并不立马执行,只是返回一个生成器对象。可以与for循环搭配使用,不断迭代。第一次迭代中函数会执行,从开始到达 yield 关键字,然后返回 yield 后的值作为第一次迭代的返回值。然后,每次执行这个函数都会继续执行函数内部定义的那个循环的下一次,再返回那个值,直到没有能返回的值。
举例如:
def gen(n): for i in range(n)yield i**2
利用yield关键字,有利于减小服务器资源,提高爬虫的运行效率。
第一次写博客,查找资料用了好几天,编辑格式又用了一上午,但我完成之后还是觉得很开心!
小伙伴们既然都看到这句话了,那就动手点个赞评个论把!!!