爬蟲(chóng)框架(scrapy構架)
優(yōu)采云 發(fā)布時(shí)間: 2020-07-03 08:001.scrapy構架流程:
scrapy主要包括了以下組件: 1.)引擎(scrapy):用來(lái)處理整個(gè)系統的數據流,觸發(fā)事務(wù)(框架核心) 2.)調度器(Scheduler):用來(lái)接受引擎發(fā)過(guò)來(lái)的懇求,壓入隊列中,并在引擎再度懇求的時(shí)侯返回,可以想像成一個(gè)url(抓取網(wǎng)頁(yè)的網(wǎng)址或則說(shuō)鏈接)的優(yōu)先隊列,由它來(lái)決定下一個(gè)要抓取的網(wǎng)址是哪些,同時(shí)除去重復的網(wǎng)址。 3.)下載器(Downloader):用于下載網(wǎng)頁(yè)的內容,并將網(wǎng)頁(yè)內容返回給蜘蛛(Scrapy下載器是構建在twisted這個(gè)高效的異步模型上的) 4.)爬蟲(chóng)(Spiders):爬蟲(chóng)是主要干活的,用于從特定的網(wǎng)頁(yè)中提取自己想要的信息,即所謂的實(shí)體(item)。用戶(hù)也可以從中提取到鏈接,讓Scrapy繼續抓取下一個(gè)頁(yè)面。 5.)項目管線(xiàn)(Pipeline):負責處理爬蟲(chóng)從網(wǎng)頁(yè)中抽取的實(shí)體,主要的功能是持久化實(shí)體、清除不需要的信息。當頁(yè)面被爬蟲(chóng)解析后,將被發(fā)送到項目管線(xiàn),并經(jīng)過(guò)幾個(gè)特定的順序處理數據。 (只有當調度器中不存在任何request時(shí),整個(gè)程序就會(huì )停止。(對于下載失敗的url,Scrapy也會(huì )重新下載))
前置要求: pip下載scrapy模塊 yum下載tree包
-確定url地址; -獲取頁(yè)面信息;(urllib,requests) -解析頁(yè)面提取須要的信息;(xpath,bs4,正則表達時(shí)) -保存到本地(scv,json,pymysql,redis) -清洗數據(刪除不必要的內容------正則表達式) -分析數據(詞云wordcloud,jieba)
-確定url地址(spider) -獲取頁(yè)面信息(Downloader) -解析頁(yè)面提取須要的信息(spider) -保存到本地(pipeline)
scrapy1.6.0
1.工程創(chuàng )建 1.)命令行在當前目錄下創(chuàng )建mySpider
scrapy startproject mySpider
2.)創(chuàng )建成功后,進(jìn)入mySpider ,tree查看
cd mySpider tree
2.創(chuàng )建一個(gè)爬蟲(chóng)
#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() #學(xué)習人數 student=scrapy.Field()
4.編寫(xiě)spider代碼,解析 4.1確定url地址,提取頁(yè)面須要的信息(mooc.py)
class MoocSpider(scrapy,spider):
#name用于區別爬蟲(chóng),必須惟一 name=‘mooc’ #允許爬取的域名,其他網(wǎng)站的頁(yè)面直接跳過(guò) allowd_domains=[‘’,‘’] #爬蟲(chóng)開(kāi)啟時(shí)第一個(gè)裝入調度器的url地址 start_urls=[‘’] #被調用時(shí),每個(gè)新的url完成下載后爬蟲(chóng)框架,返回一個(gè)響應對象 #下面的方式負責將響應的數據剖析,提取出須要的數據items以及生成下一步須要處理的url地址懇求; def parser(self,response):
##用來(lái)檢查代碼是否達到指定位置,并拿來(lái)調試并解析頁(yè)面信息; #from scrapy.shell import inspect_response #inspect_response(response,self) #1.)實(shí)例化對象,CourseItem course=CourseItem() #分析響應的內容 #scrapy剖析頁(yè)面使用的是xpath方式 #2.)獲取每位課程的信息 courseDetails=course.xpath(’.//div[@class=“course-card-container”]’) for courseDetail in courseDetails:
#爬取新的網(wǎng)站, Scrapy上面進(jìn)行調試(parse命令logging) course[‘title’] = courseDetail.xpath(’.//h3[@class=“course-card-name”]/text()’).extract()[0] #學(xué)習人數 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跟進(jìn),獲取下一步是否有鏈接;href url=response.xpath(’.//a[contains[text(),“下一頁(yè)”]/@href’)[0].extract() if url:
#構建新的url page=‘’+url yield scrapy.Request(page,callback=slef.parse)
4.2保存我們提取的信息(文件格式:scv爬蟲(chóng)框架,json,pymysql)(pipeline.py) 如果多線(xiàn)程,記得在settings.py中分配多個(gè)管線(xiàn)并設置優(yōu)先級:
(1).將爬取的信息保存成json格式
class MyspiderPipeline(object):
def init(self):
self.f=open(Moocfilename,‘w’) #Moocfilename是寫(xiě)在settings.py里的文件名,寫(xiě)在setting.py是因為便捷更改
def process_item(self,item,spider):
#默認傳過(guò)來(lái)的格式是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).將爬取的信息保存到數據庫中 首先打開(kāi)數據庫創(chuàng )建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).通過(guò)爬取的圖片鏈接下載圖片
class ImagePipeline(object):
def get_media_requests(self,item,info):
#返回一個(gè)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 –作用:設置下載的等待時(shí)間,*敏*感*詞*集中的訪(fǎng)問(wèn)對服務(wù)器的影響最大,相當于短時(shí)間內減小服務(wù)器的負載 –缺點(diǎn):下載等待時(shí)間長(cháng),不能滿(mǎn)足段時(shí)間*敏*感*詞*抓取的要求,太短則大大降低了被ban的機率
2.策略二:禁止cookies –cookie有時(shí)也用作復數方式cookies,指個(gè)別網(wǎng)站為了分辨用戶(hù)的身分,進(jìn)行session跟蹤而存儲在用戶(hù)本地終端上的數據(通常經(jīng)過(guò)加密)。 –作用:禁止cookies也就避免了可能使用cookies辨識爬蟲(chóng)軌跡的網(wǎng)站得逞 –實(shí)現:COOKIES_ENABLES=False
3.策略三:使用user_agent池(拓展:用戶(hù)代理中間件) –為什么要使用?scrapy本身是使用Scrapy/0.22.2來(lái)表明自己的身分。這也就曝露了自己是爬蟲(chóng)的信息。 –user agent ,是指包含瀏覽器信息,操作系統信息等的一個(gè)字符串,也稱(chēng)之為一種特殊的網(wǎng)路合同。服務(wù)器通過(guò)它判定當前的訪(fǎng)問(wèn)對象是瀏覽器,郵件客戶(hù)端還是爬蟲(chóng)。
4.策略四:使用代理中間件 –web server應對爬蟲(chóng)的策略之一就是直接將你的ip或則是整個(gè)ip段都封掉嚴禁訪(fǎng)問(wèn),這時(shí)候,當ip封掉后,轉換到其他的ip繼續訪(fǎng)問(wèn)即可。
5.策略五:分布式爬蟲(chóng)Scrapy+redis+mysql # 多進(jìn)程 –Scrapy-Redis則是一個(gè)基于Redis的Scrapy分布式組件。它借助Redis對用于爬取的懇求(Requests)進(jìn)行儲存和調度(Schedule),并對爬取形成rapy一些比較關(guān)鍵的代碼,將Scrapy弄成一個(gè)可以在多個(gè)主機上同時(shí)運行的分布式爬蟲(chóng)。
米鼠網(wǎng)自創(chuàng )立以來(lái)仍然專(zhuān)注于從事政府采購、軟件項目、人才外包、獵頭服務(wù)、綜合項目等,始終秉持“專(zhuān)業(yè)的服務(wù),易用的產(chǎn)品”的經(jīng)營(yíng)理念,以“提供高品質(zhì)的服務(wù)、滿(mǎn)足顧客的需求、攜手共創(chuàng )多贏(yíng)”為企業(yè)目標,為中國境內企業(yè)提供國際化、專(zhuān)業(yè)化、個(gè)性化、的軟件項目解決方案,我司擁有一流的項目總監團隊,具備過(guò)硬的軟件項目設計和施行能力,為全省不同行業(yè)顧客提供優(yōu)質(zhì)的產(chǎn)品和服務(wù),得到了顧客的廣泛贊揚。
如有侵權請聯(lián)系郵箱()






