《精通scrapy网络爬虫》笔记

《精通scrapy网络爬虫》笔记

2023年6月29日发(作者:)

《精通scrapy⽹络爬⾍》笔记第 1 章 初识 Scrapy1.1 ⽹络爬⾍是什么1略1.2 Scrapy 简介及安装123456 scrapy 是使⽤ Python 语⾔(基于 Twisted 框架)编写的开源⽹络爬⾍框架。 安装:pip install scrapy (如果安装失败⾃⾏百度。依赖库有 lxml、 pyOpenSSL 、 Twisted 、pywin32) 判断是否安装成功: >>> import scrapy >>> n_info 帮助: scrapy -h

1.3 编写第⼀个 Scrapy 爬⾍ --重点1718192627 流程: 1.3.1 项⽬需求: 需要达到什么效果,例如取哪些字段值 1.3.2 创建项⽬ 命令:scrapy startproject < project_name >--创建⼀个爬⾍项⽬ 帮助:scrapy startproject -h 1.3.3 分析页⾯ 分析字段值对应的页⾯元素 1.3.4 实现 Spider 命令:scrapy genspider [options] < spider_name > < domain > --创建⼀个爬⾍(在startproject⾥创建) 帮助:scrapy genspider -h spider 在 project_name/spiders ⽬录下 spider 代码解释 /zkzhang1986/-Scrapy-/blob/master/example/example/spiders/book_

name 属性: ⼀个 Scrapy 项⽬中可能有多个爬⾍,每个爬⾍的 name 属性是其⾃⾝的唯⼀标识, 在同⼀个项⽬中不能有同名的爬⾍。

start_urls 属性:⼀个爬⾍总要从某个(某些)页⾯开始爬取,这样的页⾯称为起始爬取点, start_urls 属性⽤来设置⼀个爬⾍的起始爬取点 parse ⽅法:当⼀个页⾯下载完成后,Scrapy 引擎会回调⼀个我们指定的页⾯解释函数(默认为 parse ⽅法)解析页⾯。 ⼀个页⾯的解析函数通常需要完成以下两个任务: a.提取页⾯中的数据(使⽤Xpath 或 CSS 选择器) b.提取页⾯中的链接,并产⽣对链接页⾯的下载请求。 注意:页⾯解释函数通常被实现以个⽣成器函数,每⼀项从页⾯中提取的数据以及每⼀个对链接页⾯的下载请求都由 yield 语句 提交给 Scrapy 引擎 1.3.5 运⾏爬⾍ 命令:scrapy crawl < spider > -o < file > --运⾏爬⾍导出数据 帮助:scrapy -h1.4 本章⼩结1略第 2 章 编写 Spider2.1 Scrapy 框架结构及⼯作原理 --重点123456ENGINE: 引擎,框架核⼼,其他组件在其控制下协同⼯作--内部组件SCHEDULER: 调度器,负责对 SPIDER 提交的下载请求进⾏调度--内部组件DOWNLOADER: 下载器,负责下载页⾯(发送 HTTP 请求/接收 HTTP 响应)--内部组件SPIDER: 爬⾍,负责提取页⾯中的数据,并产⽣对新页⾯的下载请求--⽤户实现MIDDLEWARE: 中间件,负责对 Request 对象和 Response 对象进⾏处理--可选组件ITEMPIPELINE: 数据管道,负责对爬取到数据进⾏处理--可选组件

2.2 Request 和 Response 对象 --重点171819202.2.1 Request 对象 官⽅:/en/latest/topics/#request-objects t(url, callback=None, method='GET', headers=None, body=None, cookies=None, meta=None,

encoding='utf-8', priority=0, dont_filter=False, errback=None, flags=None, cb_kwargs=None) 常⽤参数: url,

method(请求⽅式,默认 GET),

headers(请求头部,dict 类型), body(请求正⽂ bytes 或 str 类型),

meta (Request的元数据字典,dict 类型,⽤于给框架中其他组件传递信息,⽐如中间件 ItemPipeline。 其他组件可以使⽤ Request对象 meta 属性访问该元素数据字典(),

也可以⽤于给响应处理函数传递信息),

dont_filter (过滤)

2.2.2 Response 对象 官⽅:/en/latest/topics/#response-objects se(url, status=200, headers=None, body=b'', flags=None, request=None, certificate=None 常⽤属性:xpath(query) ; css(query); urljoin(url) ⽤于构造绝对 url; ⼦类有: TextResponse HTMLResponse XmlResponse2.3 Spider 开发流程 --重点 写法: a.继承 b.为 Spider 取名 即(name = ) c.设定起始爬取点 即(start_urls = [])也可以通过重新 def start_requests(self):来代替 start_urls = [] 具体可以看看原码 d.实现页⾯解析函数 即(def parse(self,response):)2.4 本章⼩结1略第 3 章 使⽤ Selector 提取数据3.1 Selector 对象1718192021Selector 基于 lxml 库构建,并简化了 Api(BeautifulSoup) 接⼝,集两者优点于⼀⾝。or(response = None,text = None,type = None,root = None,** kwargs )3.1.1 创建对象 ⽅法1: from or import Selector text = """ 解析内容 """ selector = Selector(text = text) ⽅法2: from or import Selector from import HtmlResponse body = """" 解析内容 """ response = HtmlResponse(url,body=body,encoding='utf-8') selector = Selector(response = response) 或 or3.1.2 选中数据 调⽤ Selector 对象的 xpath 或 css ⽅法,返回的是 SelectorList 对象。可以使⽤ for 迭代访问每⼀个 Selector 对象。3.1.3 提取数据 extract() re() extract_first() SelectorList专有 re_first() SelectorList专有3.2 Response 内置 Selector12可以直接使⽤ Response 对象内置的 Selector 对象or3.3 XPath --重点1718Xpath 即 XML 路径语⾔3.3.1 基础语法/u010553139/article/details/104006117实例代码:/zkzhang1986/-Scrapy-/blob/master/practise/表达式 描述/ 选中⽂档的根(root). 选中当前节点.. 选中当前节点的⽗节点ELEMENT 选中⼦节点中所有ELEMENT元素节点//ELEMENT 选中后代节点中所ELEMENT元素节点* 选中所有元素⼦节点text() 选中所⽂本⼦节点@ATTR 选中名为ATTR的属性节点@* 选中所有属性节点[谓语] 谓语⽤来查找特定的节点或者包含某个特定值的节点3.3.2 常⽤函数string(arg):返回参数的字符串值contaions(str1,str2):判断 str1 中是否包含 str2 ,返回布尔值3.4 CSS选择器 --重点17181920实例代码:/zkzhang1986/-Scrapy-/blob/master/practise/表达式

表达式 描述 例 ⼦* 选中所有元素 *E 选中E元素 pE1,E2 选中E1和E2元素 div,preE1 E2 选中E1后代元素中的E2元素 div pE1>E2 选中E1⼦元素中的E2元素 div>pE1+E2 选中E1兄弟元素中的E2元素 p+ 选中class属性包含class的元素 .info#ID 选中id属性为ID的元素 #main[ATTR] 选中包含ATTR属性的元素 [href][ATTR=VALUE] 选中包含ATTR属性且值 为 VALUE的元素 [method=post][ATTR~=VALUE] 选中包含ATTR属性且值 包 含VALUE的元素 [class~=clearfix]E:nth-child(n) 选中E元素,且该元素必须是⽗元素的第n个⼦元素 a:nth-child(1)E:nth-last-child(n) 选中E元素,且该元素必须是⽗元素的**(倒数)**第n个⼦元素 a:nth-last-child(2)E:first-child 选中E元素,且该元素必须是⽗元素的第⼀个⼦元素 a:first-childE:last-child 选中E元素,且该元素必须是⽗元素的**(倒数)**第⼀个⼦元素 a:last-childE:emty 选中没有⼦元素的E元素 div:emptyE::text 选中E元素的⽂本节点(Text Node) p::text3.5 本章⼩结1略第 4 章 使⽤ Item 封装数据4.1 Item 和 Field --重点12345Item 基类 ⾃定义数据类(如 BookItem)的基类Field 类 ⽤来描述⾃定义数据类包含哪些字段(如 name,price 等) class BookItem(): name = () price = ()4.2 扩展 Item ⼦类 --重点12345根据需求对已有⾃定义数据类(Item ⼦类)进⾏扩展。如:在example项⽬中⼜有⼀个新的 Spider ,他负责在另外的图书⽹站爬取国外书籍(中⽂翻译版)的信息。 此类数据的信息⽐之前多了⼀个译者字段。此时可以继承 BookItem 类定义⼀个 ForeignBookItem 类 class ForeignBookItem(BookItem): translator = Field()4.3 Field 元数据12实例代码:/zkzhang1986/-Scrapy-/blob/master/practise/这节没深⼊了解,只知道 Field 是字典类型 汗4.4 本章⼩结1略第 5 章 使⽤ Item Pipeline 处理数据 --重点1Item Pipeline 的典型应⽤:清洗数据;验证数据的有效性;过滤掉重复数据;将数据存⼊数据库5.1 Item Pipelin --重点829363738394官⽅⼿册:/en/latest/topics/5.1.1 实现 Item Pipeline

例: # 第 5 章 5.1.1实现英镑与⼈民币转换 class PriceConverterPipeline(object): # 英镑兑换⼈民币汇率 exchange_rate = 8.5309 def process_item(self, item, spider): # 提取item中的price字段中的£后⾯的值然乘以汇率 price = float(item['price'][1:])*ge_rate # 保留2位⼩数,赋值回price字段 item['price']='¥%.2f'% price return item 注:⼀个 Item Pipeline 不需要继承特点基类,只需要实现某些特定的⽅法,例如 process_item、open_spider、close_spider。 ⼀个 Item Pipeline 必须实现⼀个 process_item(item,spider) ⽅法,该⽅法⽤来处理每⼀项由 Spider 爬到的数据, 其中的两个参数: Item:爬到的⼀项数据(Item 或字典) Spider:爬取此项数据的 Spider 对象。 补充说明:1.如果 process_item 在处理某项 item 时返回了⼀项数据(Item 或字典), 返回的数据会传递给下⼀级 Item Pipeline (如果有)继续处理。 2.如果 process_item 在处理某项 item 时抛出(raise)⼀个 DropItem 异常(em), 该项 item 便会被抛弃,不再传递给后⾯的 Item Pipeline 处理,也不会导出⽂件。通常在检测到⽆效数据或 想要过滤数据时,抛出 DropItem 异常。 除 process_item 外另外常⽤⽅法: open_spider(self,spider): Spider 打开时(处理数据前)回调该⽅法,通常该⽅法⽤于在开始处理数据之前完成某些初始化⼯作, 如:连接数据库。 close_spider(self,spider): Spider 关闭时(处理数据后)回调该⽅法,通常该⽤法⽤于在处理完所有数据之后完成某些清理⼯作, 如:关闭数据库。 from_crawler(cls,crawler):创建 Item Pipeline 对象时回调该类⽅法。通常,在该⽅法中通过 读取配置, 根据配置创建 Item Pipeline 对象。5.1.2 启⽤ Item Pipeline

在 中配置 代码见:/zkzhang1986/-Scrapy-/blob/master/example/example/ # Configure item pipelines # See /en/latest/topics/ ITEM_PIPELINES = { # 'ePipeline': 300, # 激活价格换算 'onverterPipeline': 302, # 激活去重 'atesPipline': 301, # 把数据保存到MongoDB # 'BPipeline':303, # 把数据保存到MongoDB ⽤from_crawler 函数设置 # 'BPipeline1': 304, }

5.2 更多例⼦1234567891.2.1 过滤重复 from ions import DropItem class DuplicatesPipline(object): def __init__(self): _set = set()

def process_item(self, item, spider): name = item['name'] # 如果 name 存在⽤ raise 抛出 DropItem 异常。 if name in _set: raise DropItem("Duplicat book found: %s" % item)

_(name) return item5.2.2 将数据存⼊在 MongoDB 代码见:/zkzhang1986/-Scrapy-/blob/master/example/example/

5.3 本章⼩结1略第 6 章 使⽤ LinkExtractor 提取链接12应⽤场景:在爬取⼀个⽹站时,需要爬取的数据通常分布在多个页⾯中,每个页⾯包含⼀部分数据以及到其他页⾯的链接。提取链接有 Selector 和 LinkExtractor 提取。6.1 使⽤ LinkExtractorfrom tractors import LinkExtractor# 创建 LinkExtractor 对象le = LinkExtractor(restrict_css=' ')# 调⽤ LinkExtractor 对象的 extract_list() ⽅法传⼊⼀个 Response 对象,返回⼀个 link 列表。links = t_links(response)# print(type(links),links)if links: # ⽤links[0]获取的Link对象属性是绝对链接地址,⽆需要⽤n拼接 next_url = links[0].url yield t(next_url, callback=)1.导⼊ LinkExtractor 位于 tractors2.创建 LinkExtractor 对象。le = LinkExtractor(restrict_css=' ') 描述出下⼀页链接所在的区域(在 下)3.调⽤ LinkExtractor 对象的 extract_list() ⽅法传⼊⼀个 Response 对象,该⽅法依据创建对象时所描述的提取规则,在 Response对象 所包含的页⾯中提取链接,最终返回⼀个列表,其中的每⼀个元素都是⼀个 link 对象,即提取到的⼀个链接。4.判断是否有 link 值。由于本例中,下⼀页链接只有⼀个链接,因此⽤links[0]获取对象,link 对象的 url 属性就是链接页⾯的绝对 url。5.⽤ yield t()继续请求。

6.2 描述提取规则1718192627实例代理:/zkzhang1986/-Scrapy-/blob/master/practise/官⽅说明:/en/latest/topics/mlLinkExtractor(allow=(), deny=(), allow_domains=(), deny_domains=(), deny_extensions=None, restrict_xpaths=(),

restrict_css=(), tags=('a', 'area'), attrs=('href', ), canonicalize=False, unique=True,

process_value=None, strip=True)参数说明:# allow: 接收⼀个正则表达式或正则表达式列表,提取绝对值url与正则表达式匹配的链接, 如果该参数为空(默认),就提取全部链接# deny: 接收⼀个正则表达式或正则表达式列表,与allow相反,排除绝对值url与正则表达式匹配的链接.# allow_domains: 接收⼀个域名或⼀个域名列表,提取到指定域的链接# deny_domains: 接收⼀个域名或⼀个域名列表,与allow_domains相反,排除指定域的链接# restrict_xpaths: 接收⼀个XPath表达式或⼀个XPath表达列表,提取XPath表达式选中区域下的链接# restrict_css: 接收⼀个CSS表达式或⼀个CSS选择器列表,提取CSS选择器选中区域下的链接# tags: 接收⼀个标签(字符串)或⼀个标签列表,提取指定标签内的链接,默认为['a','area']# attrs: 接收⼀个属性(字符串)或⼀个属性列表,提取指定属性内的链接,默认为['href].# process_value: 接收⼀个形如func(value)的回调函数。 如果传递了该参数,LinkExtractor将调⽤该回调函数对提取的每⼀个链接(如a标签的href链接)进⾏处理, 回调函数正常情况下应该返回⼀个字符串(处理结果),想要抛弃所处理结果的链接时,返回None。6.3 本章⼩结1略第 7 章 使⽤ Exporter 导出数据123负责导出数据的组件被称为Exporter(导出器)内置导出器:JSON(JsonItemExporter),JSON lines(JsonLinesItemExporter),CSV(CsvItemExporter),XML(XmlItemExporter), Pickle(PickleItemExporter),Msrshal(MsrshalItemExporter)7.1 指定如何导出数据829在导出数据时,需向 Scrapy 爬⾍提供以下信息:导出⽂件路径;导出数据格式(即选⽤哪个Exporter)如何导出数据:1、通过命令⾏参数指定;2、通过配置⽂件指定;7.1.1 命令⾏参数: 例:scrapy crawl books -o 其中:-o 导出⽂件路径 -t 参数指定导出格式。 scrapy crawl books -t csv -o

默认配置⽂件:FEED_EXPORTER_BASE 位置:t-settings DOWNLOAD_HANDLERS_BASE = { 'data': 'IDownloadHandler', 'file': 'wnloadHandler', 'http': 'wnloadHandler', 'https': 'wnloadHandler', 's3': 'rs.s3.S3DownloadHandler', 'ftp': 'nloadHandler', } ⽤户配置⽂件:FEED_EXPORTERS 位置: # 添加新的导出数据格式 FEED_EXPORTERS = {'xls':'_temExporter'}7.1.2 配置⽂件 FEED_URI: 导出⽂件路径 FEED_FORMAT:导出数据格式 FEED_EXPORT_ENCODING:导出⽂件编码 FEED_EXPORT_FIELDS:导出数据包含的字典 FEED_STORAGES:⽤户⾃定义Exporter字典,添加新的导出数据格式时使⽤7.2 添加导出数据格式1718代码见:/zkzhang1986/-Scrapy-/blob/master/example/example/my_# 以excel格式导出的Exporterfrom ers import BaseItemExporterimport xlwtclass ExcelItemExporter(BaseItemExporter): def __init__(self, file, **kwargs): self._configure(kwargs) = file = ok() = _sheet('scrapy') = 0

def finish_exporting(self): ()

def export_item(self, item): fields = self._get_serialized_fields(item) for col, v in enumerate(x for _,x in fields): (,col,v) += 17.3 本章⼩结1略第 8 章 项⽬练习1见代码:/zkzhang1986/-Scrapy-/tree/master/toscrape_book8.1 项⽬需求8.2 页⾯分析8.3 编码实现8.4 本章⼩结1略第 9 章 下载⽂件和图⽚9.1 FilesPipeline 和 ImagesPipeline8293637389.1.1 FilesPipeline 使⽤说明 ⽂件下载器:FilesPipeline

步骤: 中启⽤ FilesPipeline,通常将其置于其他 Item Pipeline之前,如 ITEM_PIPELINES = {'ipeline':1,} 2. 使⽤ FILES_STORE 指定⽂件下载⽬录,如 FILES_STORE = 'examples_src' 3. 在 Pipeline 中写⽂件下载器 在 Spider 解释⼀个包含⽂件下载链接的页⾯时,将所有需要下载⽂件的 url 地址收集到⼀个列表,赋给 item 的 file_url字段 (item['file_urls']).FilesPipeline 在处理每⼀项 item 时,会读取 item['file_urls'],对其中每⼀个url进⾏下载; class DownloadBookSpider(): ... def parse(response): item = {} # 下载列表 item['fiel_urls'] = [] for url in ('//a/@href').extract(): download_url = n(url) # 将 url 填⼊下载列表 item['file_urls'].append(download_url) yiedl item9.1.2 ImagesPipeline 使⽤说明 图⽚下载器:ImagesPipeline

ImagesPipeline 和 FielsPipeline FielsPipeline ImagesPipeline 导⼊路径: | Pipeline Item字段:file_urls,files | image_urls,images 下载⽬录:FILES_STORE | IMAGES_STORE ImagesPipeline 特有功能 1.为图⽚⽣成缩略图: 设置 IMAGES_THUMBS,它是⼀个字典,每⼀项的值都是缩略图的尺⼨,代码如下: IMAGES_THUMBS = { 'small':(50,50), 'big':(270,270) } 开启后,下载⼀张图⽚时,本地会出现3张图⽚,1张原图,2张缩略图 2. 过滤尺⼨过⼩的图⽚: 设置 IMAGES_MIN_WIDTH 和 IMAGES_MIN_HEIGHI,它们分别指定图⽚最⼩宽和⾼,代码如下: IMAGES_MIN_WIDTH = 11O IMAGE_MIN_HEIGHI = 1109.2 项⽬实例:爬取 matplotlib例⼦源码⽂件123459.2.1 需求: 下载 ⽹站中所有例⼦的源码⽂件到本地9.2.2 页⾯分析:9.2.3 编码实现

代码见:/zkzhang1986/-Scrapy-/tree/master/matplotlib_examples9.3 项⽬实例:下载 360 图⽚1 代码见:/zkzhang1986/-Scrapy-/tree/master/so_image9.4 本章⼩结1略第 10 章 模拟登录10.1 登录实质8293637383946474849505152测试⽹站:/places/default/user/login登录⽹站后按 F12 打开开发者⼯具。选择 Elements 点击 form 表单代码如下:

5253545556575859666768697677787986878889969798995116117
10.1.1 分析:例:

的 method 属性决定了 HTTP 请求的⽅法 (例为 POST);的 action 属性决定了 HTTP 请求的 url (例为 # ,也就是当前页);的 enctype 属性决定了表单数据的编码类型(例为 x-www-form-urlencoded);扩展阅读:post使⽤form-data和x-www-form-urlencoded的本质区别 /u013827143/article/details/86222486中的元素决定了表单数据的内容例: ⽤户填写⽤户名

XXX
说明: 在
XXX
中的百XXX内容不显⽰度可以通过JS使改DIV的display属性变成block则这些知内容显⽰出来此效果⽤途很⼴, 道⽐如有的⽬录树,版⽐如论坛的回复查看内容等权等

中包含了3个隐藏的 ,它们的值在 value 属性中,虽然不需要⽤户填写, 但提交表单数据中缺少它们的话可能会导致登录验证失败,这些隐藏的有其他⽤途,⽐如: ⽤来告诉服务器,登录成功后跳转的地址。 例:/places/default/index 为 /places/default/index ⽤来防⽌CSRT跨域攻击。10.1.2 登录:填⼊账号、密码登录,点击 Log In 在 NetWork 中查看⽂件 (login)不同⽂件不同Form Data (提交表单数据)email: zk_zhang1986@sword: zzk123_next: /places/default/index_formkey: 51ee44dd-d8ed-4963-a58c-6e607db9f298_formname: login实际post提交是数据email=zk_zhang1986%&password=zzk123&_next=%2Fplaces%2Fdefault%2Findex&_formkey=51ee44dd-d8ed-4963-a58c-6e607db9f298&_formname=login(主要是分析 Form Data 数据以及构造)GeneralRequest URL: /places/default/user/login?_next=/places/default/indexRequest Method: POSTStatus Code: 303 SEE OTHERRemote Address: 207.38.86.225:80Referrer Policy: no-referrer-when-downgradeResponse HeadersConnection: keep-aliveContent-Type: text/html; charset=UTF-8Date: Thu, 14 May 2020 09:27:49 GMT4125126Date: Thu, 14 May 2020 09:27:49 GMTLocation: /places/default/indexServer: nginxSet-Cookie: session_id_places=True; httponly; Path=/Transfer-Encoding: chunked登录成功后 Response Headers 中 Set_Cookies 字段就是⽹站服务器保存在客户端(浏览器)的 Cookie 信息,之后对该⽹站发送的其他 HTTP 请求都会带上这个“⾝份证”(session信息),服务器程序通过这个“⾝份证”识别出发送请求的⽤户,从⽽决定响应怎样的页⾯。另外响应状态码是303,代表页⾯重定向,浏览器会读取响应头部中的 Location 字段,依据其中描述的路径(本例为/places/default/index),再次发送⼀个GET请求。Set-Cookie: session_data_places="ea84dc38f8185037c6075091623fd836:gQzQdNRsYwkCwLT6Sp9K7zJHYgw20nU1TywjSVdWWK8XhtPGf6x55zzx3zgio10.2 Scrapy 模拟登录10.3 识别验证码10.4 Cookie登录10.5 本章⼩结1略第 11 章 爬取动态页⾯11.1 Splash 渲染引擎11.2 在 Scrapy 中使⽤ Splash11.3 项⽬实例:爬取 toscrape 中的名⼈名⾔11.4 项⽬实例:爬取京东商城中的书籍信息11.5 本章⼩结1略第 12 章 存⼊数据库12.1 SQLite12.2 MySQL12.3 MongoDB12.4 Redis12.5 本章⼩结1略第 13 章 使⽤ HTTP 代理13.1 HttpProxyMiddleware13.2 使⽤多个代理13.3 获取免费代理13.4 实现随机代理13.5 项⽬实例:爬取⾖瓣电影信息1 免费代理⽤不了。13.6 本章⼩结第 14 章 分布式爬⾍14.1 Redis 的使⽤14.2 scrapy-redis 源码分析14.3 使⽤scrapy-redis 进⾏分布式爬取14.4 本章⼩结1略

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687984217a63742.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信