Scrapy爬虫框架的介绍,实战

📅 2026/8/27 8:56:53
Scrapy爬虫框架的介绍,实战
介绍 是什么这是一套, 基于某种情况的, 异步处理框架, 它是完全实现的, 爬虫框架, 在这里, 用户只要专门进行设定, 开发几个模块, 便能够不费力气地实现一个爬虫, 这个爬虫可用于抓取网页内容, 或者抓取各种图片。框架在这个系统里, 引擎所扮演的角色如同是一个中枢性的站点的存在, 它承担着负责, Item , 以及四个组件之间相互的通信工作。比如说, 它会把接收到的, 发送给, 会将的存储请求朝着Item 方向去做发送。发送了的那个, 一定会被引擎提交到进行处理的流程当中, 而当处理完成之后便会发送向引擎这里。引擎接着再把它发送到达去进行相应的处理呢。好似一个解析器, 专门负责去接收, 那发送过来的内容, 针对其展开解析工作, 你能够于其内部撰写解析所依据的规则。经过解析之后的内容, 能够发送存储的请求给另一个对象, 此谓对象一。在对象一中解析提取出的全新的url, 可以向着另一个对象发出去请求, 这便是对象二。要留意, 入口url同样是存储在对象一中的。下载器会针对发送过来的url予以下载, 随后把下载好的网页反馈给。你能够将其理解成一种可以对列, 用以储存传送过来的url, 并且以顺序把url取出来发送给去开展操作。项: 于项里你能够界定自身的存储架构, 借助其便利数据之存入。于此之中, 你能够在这个范围, 针对数据开展存贮方面的操作, 比如说把数据留存至数据库, 又或是按照csv格式存于本地, 并且是在这个特定的情境下。你能于其中针对ip实行代理, 或者对自己的头文件予以封装来对应某些反爬虫机制。你能够增添代码用以处置发送给的, 以及所产生的item和。创建爬虫项目最先的那一步, 我们首要去着手建构一个爬虫类型的项目。把cmd运行程序开启来, 抵达打算完成创建的那个目录范围里, 键入下面这样的指令。创建成功后将项目导入至中先来看配置文件.cfg。.py文件中可以进行爬虫配置的设置其他设置, 于往后开展项目之际, 在有需要之时, 再予以介绍, 此处便不再逐一详细叙述, 实际上我也并非全然明晰, 不过无需着急, 徐徐推进即可。Item.py文件是用来定义存储结构的地方。那么, 进行编写解析规则的那个文件处于哪里呢? 没错, 的确是未曾寻得, 在此处我们需要借助命令行去生成该文件, 先抵达项目目录, 接着输入下述命令。到这个时候, 我们能够看到这么一种情况, 那就是目录之中已然生成了.py文件。而后, 在当下这个时刻, 我们便能够于此处书写解析规则了。其它的我也不多做赘述在下面的爬虫实战中会再详细说明。实战 目标爬取豆瓣电影的所有电影信息将信息存储至数据库。分析打开网页分析我们要爬取的内容。为完成任务, 我们得去抓取关于电影那些比如说排名, 名字, 还有出品年份这类信息。首先要在Item.py里对数据结构予以定义。再来分析一下网页源码通过XPath规则定位到电影信息标签现在我们就开始爬虫我们现在先编写文件def parse(self, response): #爬取电影item movie_itemresponse.xpath(//div[classarticle]/ol/li) for item in movie_item: #创建存储对象 movieItemMoviespiderItem() #爬取电影信息 #电影序号 movieItem[serial_number]item.xpath(.//div/div/em/text()).extract_first() #电影名称 movieItem[film_name] item.xpath(.//div/div/div/a/span[classtitle]/text()).extract_first() #电影的年份 制作人等信息 info_itemitem.xpath(.//div/div/div[classbd]/p[1]/text()).extract() #电影制作人 movieItem[film_maker].join(info_item[0].split()) #电影年份 movieItem[film_time] (.join(info_item[1].split())).split(/)[0] #电影出品国家 movieItem[film_country] (.join(info_item[1].split())).split(/)[1] #电影类型 movieItem[film_type] (.join(info_item[1].split())).split(/)[2] #电影引用 movieItem[film_quote] item.xpath(.//div/div/div[classbd]/p[2]/span/text()).extract_first() #电影评分 movieItem[film_score] item.xpath(.//div/div/div[classbd]/div/span[classrating_num]/text()).extract_first() #将数据传到pipeline yield movieItem #解析下一页url next_pageresponse.xpath(//div[classpaginator]/span[classnext]/link/href).extract() #判断是否有下一页 if next_page: next_pagenext_page[0] urlself.start_urls[0]next_page #将下一页url传给调度器 yield scrapy.Request(url,callbackself.parse)进行运行, 以此查看, 能否将所需内容成功爬取到。于cmd命令行里输入命令。E:\code\Python\python spider\movieSpiderscrapy crawl movieSpider爬取结果能够看到, 我们已然爬取到了所需的内容。然而, 有一点是需要留意的, 在采取爬取行动之前, 得在.py里对User-Agent进行相关设置。要是已经爬取到了内容, 那就得针对内容开展存储操作, 首先来讲一讲怎样存储到本地, 将其以csv文件的形式存至本地仅需输入下面这个命令。E:\code\Python\python spider\movieSpiderscrapy crawl movie_spider -o movie_list.csv运行后我们可以来到爬虫目录中查看到我们保存的csv文件相较于保存到本地而言把我们的爬虫项目保存到数据库之中会更便利我们去对数据开展操作并且也更契合企业得要求, 这里我用的是mysql数据库, 那我们要先去创建数据库, 接着创建用以存储内容的表, 这一过程我就省略不讲了, 当下主要讲那我们怎样来连接数据库并把内容实现保存, 首先我们得明确一点呢那却是在项目之中的哪一个组件去完成这一操作, 这点在文章的开头是说过的, 组件是用于进行数据存储的。首先, 我们于文件里设定我们的mysql参数, 如此一来, 往后的操作会更便利, 并且逻辑性更强。再来我们就可以在中进行存储操作了# -*- coding: utf-8 -*- import pymysql from movieSpider.settings import table_name,mysql_port,mysql_db,mysql_passwd,mysql_user,mysql_host class MoviespiderPipeline(object): def __init__(self): #连接数据库 #self.connpymysql.connect(hosthost,portport,useruser,passwordpasswd,dbdatabase,charsetutf8) self.conn pymysql.connect(hostmysql_host, usermysql_user, passwordmysql_passwd, dbmysql_db,portmysql_port) #创建游标对象 self.curself.conn.cursor() def process_item(self, item, spider): #将item转化为dict类型 datadict(item) #将数据插入数据库 self.cur.execute(INSERT INTO movie_top250 (serial_number,film_name,film_country,film_time,film_type,film_maker,film_score,film_quote) VALUE (%(serial_number)s,%(film_name)s,%(film_country)s,%(film_time)s,%(film_type)s,%(film_maker)s,%(film_score)s,%(film_quote)s),data) self.conn.commit() return item我们来运行一下看是否保存到数据库运行前记得要在中开启紧接着, 我们再来阐述一番基本的反爬机制, 主要涵盖设置头文件里的User - Agent, 以及设置代理ip 的操作。眼下就仅仅讲讲前面提及的那种方法, 毕竟后面那种方法需要借助代理服务器, 而我根本买不起, 所以就不再赘述了。那么在此处又应当于哪里去编写我们的代码呢, 我们再回过头去瞧瞧文章起始部分的j框架图, 很明显, 我们得在其中予以实现。接着来到.py文件当中, 声明一个类, 在该类内部的默认函数里去进行实现。当然了, 再次郑重提醒, 我们必须要在文件里开启此方法。class random_user_agent(object): def process_request(self,request,spider): #user_agent设备列表 USER_AGENT_LIST [MSIE (MSIE 6.0; X11; Linux; i686) Opera 7.23, Opera/9.20 (Macintosh; Intel Mac OS X; U; en), Opera/9.0 (Macintosh; PPC Mac OS X; U; en), iTunes/9.0.3 (Macintosh; U; Intel Mac OS X 10_6_2; en-ca), Mozilla/4.76 [en_jp] (X11; U; SunOS 5.8 sun4u), iTunes/4.2 (Macintosh; U; PPC Mac OS X 10.2), Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:5.0) Gecko/20100101 Firefox/5.0, Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0, Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20120813 Firefox/16.0, Mozilla/4.77 [en] (X11; I; IRIX;64 6.5 IP30), Mozilla/4.8 [en] (X11; U; SunOS; 5.7 sun4u)] #从USER_AGENT_LIST随机选择 user_agentrandom.choice(USER_AGENT_LIST) request.headers[User_Agent]user_agent总结这篇文章仅能算作爬虫的入门, 在各种各样的需求当中, 爬虫项目比这要复杂许多, 并且网站的反爬机制同样复杂许多, 需要学习的内容还非常多, 此文章是为了强化自身的记忆与理解, 也是为了给刚入门的人提供一个参考, 文章要是存在错误之处, 期望各位大佬予以指出, 也期望能给予我一些指导与帮助。