爬虫框架(scrapy构架)

优采云 发布时间: 2020-07-03 08:00

  1.scrapy构架流程:

  

  scrapy主要包括了以下组件: 1.)引擎(scrapy):用来处理整个系统的数据流,触发事务(框架核心) 2.)调度器(Scheduler):用来接受引擎发过来的恳求,压入队列中,并在引擎再度恳求的时侯返回,可以想像成一个url(抓取网页的网址或则说链接)的优先队列,由它来决定下一个要抓取的网址是哪些,同时除去重复的网址。 3.)下载器(Downloader):用于下载网页的内容,并将网页内容返回给蜘蛛(Scrapy下载器是构建在twisted这个高效的异步模型上的) 4.)爬虫(Spiders):爬虫是主要干活的,用于从特定的网页中提取自己想要的信息,即所谓的实体(item)。用户也可以从中提取到链接,让Scrapy继续抓取下一个页面。 5.)项目管线(Pipeline):负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管线,并经过几个特定的顺序处理数据。 (只有当调度器中不存在任何request时,整个程序就会停止。(对于下载失败的url,Scrapy也会重新下载))

  前置要求: pip下载scrapy模块 yum下载tree包

  -确定url地址; -获取页面信息;(urllib,requests) -解析页面提取须要的信息;(xpath,bs4,正则表达时) -保存到本地(scv,json,pymysql,redis) -清洗数据(删除不必要的内容------正则表达式) -分析数据(词云wordcloud,jieba)

  -确定url地址(spider) -获取页面信息(Downloader) -解析页面提取须要的信息(spider) -保存到本地(pipeline)

  scrapy1.6.0

  1.工程创建 1.)命令行在当前目录下创建mySpider

  scrapy startproject mySpider

  2.)创建成功后,进入mySpider ,tree查看

  cd mySpider tree

  

  2.创建一个爬虫

  #scrapy genspider 项目名 url scrapy genspider mooc ‘’

  3.定义爬取的items内容(items.py)

  class CourseItem(scrapy.Item):

  #课程标题 title=scrapy.Field() #课程的url地址 url=scrapy.Field() #课程图片的url地址 image_url=scrapy.Field() #课程的描述 introduction=scrapy.Field() #学习人数 student=scrapy.Field()

  4.编写spider代码,解析 4.1确定url地址,提取页面须要的信息(mooc.py)

  class MoocSpider(scrapy,spider):

  #name用于区别爬虫,必须惟一 name=‘mooc’ #允许爬取的域名,其他网站的页面直接跳过 allowd_domains=[‘’,‘’] #爬虫开启时第一个装入调度器的url地址 start_urls=[‘’] #被调用时,每个新的url完成下载后爬虫框架,返回一个响应对象 #下面的方式负责将响应的数据剖析,提取出须要的数据items以及生成下一步须要处理的url地址恳求; def parser(self,response):

  ##用来检查代码是否达到指定位置,并拿来调试并解析页面信息; #from scrapy.shell import inspect_response #inspect_response(response,self) #1.)实例化对象,CourseItem course=CourseItem() #分析响应的内容 #scrapy剖析页面使用的是xpath方式 #2.)获取每位课程的信息 courseDetails=course.xpath(’.//div[@class=“course-card-container”]’) for courseDetail in courseDetails:

  #爬取新的网站, Scrapy上面进行调试(parse命令logging) course[‘title’] = courseDetail.xpath(’.//h3[@class=“course-card-name”]/text()’).extract()[0] #学习人数 course[‘student’] = courseDetail.xpath(’.//span/text()’).extract()[1] #课程描述: course[‘introduction’] = courseDetail.xpath(".//p[@class=‘course-card-desc’]/text()").extract()[0] #课程链接, h获取/learn/9 ====》 course[‘url’] = “” + courseDetail.xpath(’.//a/@href’).extract()[0] #课程的图片url: course[‘image_url’] = ‘http:’ + courseDetail.xpath(’.//img/@src’).extract()[0] yield course #url跟进,获取下一步是否有链接;href url=response.xpath(’.//a[contains[text(),“下一页”]/@href’)[0].extract() if url:

  #构建新的url page=‘’+url yield scrapy.Request(page,callback=slef.parse)

  4.2保存我们提取的信息(文件格式:scv爬虫框架,json,pymysql)(pipeline.py) 如果多线程,记得在settings.py中分配多个管线并设置优先级:

  

  (1).将爬取的信息保存成json格式

  class MyspiderPipeline(object):

  def init(self):

  self.f=open(Moocfilename,‘w’) #Moocfilename是写在settings.py里的文件名,写在setting.py是因为便捷更改

  def process_item(self,item,spider):

  #默认传过来的格式是json格式 import json #读取item中的数据,并转化为json格式 line=json.dumps(dict(item),ensure_ascii=False,indent=4) self.f.write(line+’\n’) #一定要返回给调度器 return item

  def close_spider(self,spider):

  self.f.close()

  (2).保存为scv格式

  class CsvPipeline(object):

  def init(self):

  self.f=open(’'mooc.csv",‘w’)

  def process_item(self,item,spider):

  item=dict(item) self.f.write("{0}:{1}:{2}\n".format(item[‘title’] , item[‘student’] , item[‘url’])) return item

  def close_spider(self,spider):

  self.f.close()

  (3).将爬取的信息保存到数据库中 首先打开数据库创建mooc表

  class MysqlPipeline(object):

  def init(self):

  self.conn=pymysql.connect( host=‘localhost’, user=‘root’, password=‘redhat’, db=‘Mooc’, charset=‘utf8’, ) self.cursor=self.conn.cursor()

  def process_item(self,item,spider):

  item=dict(item) info=(item[’‘item"] , item[“url”] , item[“image_url”] , item[“introduction”] , item[“student”]) insert_sqil="insert into moocinfo values(’%s’ , ‘%s’ , ‘%s’, ‘%s’ , ‘%s’); " %(info) self.cursor.execute(insert_sqil) mit() return item

  def open_spider(self,spider):

  create_sqli=“create table if not exists moocinfo (title varchar(50),url varchar(200), image_url varchar(200), introduction varchar(500), student int)” self.cursor.execute(create_sqli)

  def close_spider(self,spider):

  self.cursor.close() self.conn.close()

  (4).通过爬取的图片链接下载图片

  class ImagePipeline(object):

def get_media_requests(self,item,info):

#返回一个request请求,包含图片的url

yield scrapy.Request(item['image_url'])

def item_conpleted(self,results,item,info):

#获取下载的地址

image_xpath=[x['path'] for ok , x in results if ok]

if not image_path:

raise Exception('不包含图片')

else:

return item

  1.策略一:设置download_delay –作用:设置下载的等待时间,*敏*感*词*集中的访问对服务器的影响最大,相当于短时间内减小服务器的负载 –缺点:下载等待时间长,不能满足段时间*敏*感*词*抓取的要求,太短则大大降低了被ban的机率

  2.策略二:禁止cookies –cookie有时也用作复数方式cookies,指个别网站为了分辨用户的身分,进行session跟踪而存储在用户本地终端上的数据(通常经过加密)。 –作用:禁止cookies也就避免了可能使用cookies辨识爬虫轨迹的网站得逞 –实现:COOKIES_ENABLES=False

  3.策略三:使用user_agent池(拓展:用户代理中间件) –为什么要使用?scrapy本身是使用Scrapy/0.22.2来表明自己的身分。这也就曝露了自己是爬虫的信息。 –user agent ,是指包含浏览器信息,操作系统信息等的一个字符串,也称之为一种特殊的网路合同。服务器通过它判定当前的访问对象是浏览器,邮件客户端还是爬虫。

  4.策略四:使用代理中间件 –web server应对爬虫的策略之一就是直接将你的ip或则是整个ip段都封掉严禁访问,这时候,当ip封掉后,转换到其他的ip继续访问即可。

  5.策略五:分布式爬虫Scrapy+redis+mysql # 多进程 –Scrapy-Redis则是一个基于Redis的Scrapy分布式组件。它借助Redis对用于爬取的恳求(Requests)进行储存和调度(Schedule),并对爬取形成rapy一些比较关键的代码,将Scrapy弄成一个可以在多个主机上同时运行的分布式爬虫。

  米鼠网自创立以来仍然专注于从事政府采购、软件项目、人才外包、猎头服务、综合项目等,始终秉持“专业的服务,易用的产品”的经营理念,以“提供高品质的服务、满足顾客的需求、携手共创多赢”为企业目标,为中国境内企业提供国际化、专业化、个性化、的软件项目解决方案,我司拥有一流的项目总监团队,具备过硬的软件项目设计和施行能力,为全省不同行业顾客提供优质的产品和服务,得到了顾客的广泛赞扬。

  

  如有侵权请联系邮箱()

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线