日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Python爬蟲之教你利用Scrapy爬取圖片

瀏覽:36日期:2022-06-22 13:35:24
Scrapy下載圖片項(xiàng)目介紹

Scrapy是一個(gè)適用爬取網(wǎng)站數(shù)據(jù)、提取結(jié)構(gòu)性數(shù)據(jù)的應(yīng)用程序框架,它可以通過定制化的修改來滿足不同的爬蟲需求。

使用Scrapy下載圖片項(xiàng)目創(chuàng)建

首先在終端創(chuàng)建項(xiàng)目

# win4000為項(xiàng)目名$ scrapy startproject win4000

該命令將創(chuàng)建下述項(xiàng)目目錄。

項(xiàng)目預(yù)覽

查看項(xiàng)目目錄

win4000 win4000 spiders __init__.py __init__.py items.py middlewares.py pipelines.py settings.py scrapy.cfg創(chuàng)建爬蟲文件

進(jìn)入spiders文件夾,根據(jù)模板文件創(chuàng)建爬蟲文件

$ cd win4000/win4000/spiders# pictures 為 爬蟲名$ scrapy genspider pictures 'win4000.com'項(xiàng)目組件介紹

1.引擎(Scrapy):核心組件,處理系統(tǒng)的數(shù)據(jù)流處理,觸發(fā)事務(wù)。

2.調(diào)度器(Scheduler):用來接受引擎發(fā)出的請求, 壓入隊(duì)列中, 并在引擎再次請求的時(shí)候返回。由URL組成的優(yōu)先隊(duì)列, 由它來決定下一個(gè)要抓取的網(wǎng)址是什么,同時(shí)去除重復(fù)的網(wǎng)址。

3.下載器(Downloader):用于下載網(wǎng)頁內(nèi)容, 并將網(wǎng)頁內(nèi)容返回給Spiders。

4.爬蟲(Spiders):用于從特定的網(wǎng)頁中提取自己需要的信息, 并用于構(gòu)建實(shí)體(Item),也可以從中提取出鏈接,讓Scrapy繼續(xù)抓取下一個(gè)頁面

5.管道(Pipeline):負(fù)責(zé)處理Spiders從網(wǎng)頁中抽取的實(shí)體,主要的功能是持久化實(shí)體、驗(yàn)證實(shí)體的有效性、清除不需要的信息。當(dāng)頁面被Spiders解析后,將被發(fā)送到項(xiàng)目管道。

6.下載器中間件(Downloader Middlewares):位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應(yīng)。

7.爬蟲中間件(Spider Middlewares):介于Scrapy引擎和爬蟲之間的框架,主要工作是處理Spiders的響應(yīng)輸入和請求輸出。

8.調(diào)度中間件(Scheduler Middewares):介于Scrapy引擎和調(diào)度之間的中間件,從Scrapy引擎發(fā)送到調(diào)度的請求和響應(yīng)。

Scrapy爬蟲流程介紹

Scrapy基本爬取流程可以描述為UR2IM(URL-Request-Response-Item-More URL):

1.引擎從調(diào)度器中取出一個(gè)鏈接(URL)用于接下來的抓取;

2.引擎把URL封裝成一個(gè)請求(Request)傳給下載器;

3.下載器把資源下載下來,并封裝成應(yīng)答包(Response);

4.爬蟲解析Response;

5.解析出實(shí)體(Item),則交給實(shí)體管道進(jìn)行進(jìn)一步的處理;

6.解析出的是鏈接(URL),則把URL交給調(diào)度器等待抓取。

頁面結(jié)構(gòu)分析

首先查看目標(biāo)頁面,可以看到包含多個(gè)主題,選取感興趣主題,本項(xiàng)目以“風(fēng)景”為例(作為練習(xí),也可以通過簡單修改,來爬取所有模塊內(nèi)圖片)。

Python爬蟲之教你利用Scrapy爬取圖片

在“風(fēng)景”分類頁面,可以看到每頁包含多個(gè)專題,利用開發(fā)者工具,可以查看每個(gè)專題的URL,拷貝相應(yīng)XPath,利用Xpath的規(guī)律性,構(gòu)建循環(huán),用于爬取每個(gè)專題內(nèi)容。

Python爬蟲之教你利用Scrapy爬取圖片

# 查看不同專題的XPath# /html/body/div[3]/div/div[3]/div[1]/div[1]/div[2]/div/div/ul/li[1]/a# /html/body/div[3]/div/div[3]/div[1]/div[1]/div[2]/div/div/ul/li[2]/a

利用上述結(jié)果,可以看到li[index]中index為專題序列。因此可以構(gòu)建Xpath列表如下:

item_selector = response.xpath(’/html/body/div[3]/div/div[3]/div[1]/div[1]/div[2]/div/div/ul/li/a/@href’)

利用開發(fā)者工具,可以查看下一頁的URL,拷貝相應(yīng)XPath用于爬取下一頁內(nèi)容。

Python爬蟲之教你利用Scrapy爬取圖片

# 查看“下一頁”的XPath# /html/body/div[3]/div/div[3]/div[1]/div[2]/div/a[5]

因此可以構(gòu)建如下XPath:

next_selector = response.xpath(’//a[@class='next']’)

點(diǎn)擊進(jìn)入專題,可以看到具體圖片,通過查看圖片XPath,用于獲取圖片地址。

Python爬蟲之教你利用Scrapy爬取圖片

# 構(gòu)建圖片XPathresponse.xpath(’/html/body/div[3]/div/div[2]/div/div[2]/div[1]/div/a/img/@src’).extract_first()

可以通過標(biāo)題和圖片序列構(gòu)建圖片名。

Python爬蟲之教你利用Scrapy爬取圖片Python爬蟲之教你利用Scrapy爬取圖片

# 利用序號XPath構(gòu)建圖片在列表中的序號index = response.xpath(’/html/body/div[3]/div/div[2]/div/div[1]/div[1]/span/text()’).extract_first()# 利用標(biāo)題XPath構(gòu)建圖片標(biāo)題title = response.xpath(’/html/body/div[3]/div/div[2]/div/div[1]/div[1]/h1/text()’).extract_first()# 利用圖片標(biāo)題title和序號index構(gòu)建圖片名name = title + ’_’ + index + ’.jpg’

同時(shí)可以看到,在專題頁面下,包含了多張圖片,可以通過點(diǎn)擊“下一張”按鈕來獲取下一頁面URL,此處為了簡化爬取過程,可以通過觀察URL規(guī)律來構(gòu)建每一圖片詳情頁的URL,來下載圖片。

Python爬蟲之教你利用Scrapy爬取圖片

# 第一張圖片詳情頁地址# http://www.win4000.com/wallpaper_detail_45401.html# 第二張圖片詳情頁地址# http://www.win4000.com/wallpaper_detail_45401_2.html

因此可以通過首頁地址和圖片序號來構(gòu)建每一張圖片詳情頁地址。

# 第一張圖片詳情頁地址first_url = response.url# 圖片總數(shù)num = response.xpath(’/html/body/div[3]/div/div[2]/div/div[1]/div[1]/em/text()’).extract_first()num = int(num)for i in range(2,num+1): next_url = ’.’.join(first_url.split(’.’)[:-1]) + ’_’ + str(i) + ’.html’

定義Item字段(Items.py)

本項(xiàng)目用于下載圖片,因此可以僅構(gòu)建圖片名和圖片地址字段。

# win4000/win4000/items.pyimport scrapyclass Win4000Item(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() url = scrapy.Field() name = scrapy.Field()

編寫爬蟲文件(pictures.py)

代碼詳解見代碼注釋。

# win4000/win4000/spiders/pictures.pyimport scrapyfrom win4000.items import Win4000Itemfrom urllib import parseimport timeclass PicturesSpider(scrapy.Spider): name = ’pictures’ allowed_domains = [’win4000.com’] start_urls = [’http://www.win4000.com/zt/fengjing.html’]start_urls = [’http://www.win4000.com/zt/fengjing.html’] # cookie用于模仿瀏覽器行為 cookie={'t':'29b7c2a8d2bbf060dc7b9ec00e75a0c5','r':'7957','UM_distinctid':'178c933b40e9-08430036bca215-7e22675c-1fa400-178c933b40fa00','CNZZDATA1279564249':'1468742421-1618282415-%7C1618282415','XSRF-TOKEN':'eyJpdiI6Ik8rbStsK1Fwem5zR2YzS29ESlI2dmc9PSIsInZhbHVlIjoiaDl5bXp5b1VvWmdSYklWWkEwMWJBK0FaZG9OaDA1VGQ2akZ0RDNISWNDM0hnOW11Q0JTVDZFNlY4cVwvSTBjQlltUG9tMnFUcWd5MzluUVZ0NDBLZlJuRWFuaVF0U3k0XC9CU1dIUzJybkorUEJ3Y2hRZTNcL0JqdjZnWjE5SXFiNm8iLCJtYWMiOiI2OTBjOTkzMTczYWQwNzRiZWY5MWMyY2JkNTQxYjlmZDE2OWUyYmNjNDNhNGYwNDAyYzRmYTk5M2JhNjg5ZmMwIn0%3D','win4000_session':'eyJpdiI6Inc2dFprdkdMTHZMSldlMXZ2a1cwWGc9PSIsInZhbHVlIjoiQkZHVlNYWWlET0NyWWlEb2tNS0hDSXAwZGVZV05vTmY0N0ZiaFdTa1VRZUVqWkRmNWJuNGJjNkFNa3pwMWtBcFRleCt4SUFhdDdoYnlPMGRTS0dOR0tkdmVtVDhzUWdTTTc3YXpDb0ZPMjVBVGJzM2NoZzlGa045Qnl0MzRTVUciLCJtYWMiOiI2M2VmMTEyMDkxNTIwNmJjZjViYTg4MjIwZGIxNTlmZWUyMTJlYWZhNjk5ZmM0NzgyMTA3MWE4MjljOWY3NTBiIn0%3D' }def start_requests(self):'''重構(gòu)start_requests函數(shù),用于發(fā)送帶有cookie的請求,模仿瀏覽器行為'''yield scrapy.Request(’http://www.win4000.com/zt/fengjing.html’, callback=self.parse, cookies=self.cookie) def parse(self,response): # 獲取下一頁的選擇器next_selector = response.xpath(’//a[@class='next']’)for url in next_selector.xpath(’@href’).extract(): url = parse.urljoin(response.url,url) # 暫停執(zhí)行,防止網(wǎng)頁的反爬蟲程序 time.sleep(3) # 用于爬取下一頁 yield scrapy.Request(url, cookies=self.cookie)# 用于獲取每一專題的選擇器item_selector = response.xpath(’/html/body/div[3]/div/div[3]/div[1]/div[1]/div[2]/div/div/ul/li/a/@href’)for item_url in item_selector.extract(): item_url = parse.urljoin(response.url,item_url) #print(item_url) time.sleep(3) # 請求專題頁面,并利用回調(diào)函數(shù)callback解析專題頁面 yield scrapy.Request(item_url,callback=self.parse_item, cookies=self.cookie)def parse_item(self,response):'''用于解析專題頁面'''# 由于Scrapy默認(rèn)并不會(huì)爬取重復(fù)頁面,# 因此需要首先構(gòu)建首張圖片實(shí)體,然后爬取剩余圖片,# 也可以通過使用參數(shù)來取消過濾重復(fù)頁面的請求# 首張圖片實(shí)體item = Win4000Item()item[’url’] = response.xpath(’/html/body/div[3]/div/div[2]/div/div[2]/div[1]/div/a/img/@src’).extract_first()index = response.xpath(’/html/body/div[3]/div/div[2]/div/div[1]/div[1]/span/text()’).extract_first()item[’name’] = response.xpath(’/html/body/div[3]/div/div[2]/div/div[1]/div[1]/h1/text()’).extract_first() + ’_’ + index + ’.jpg’yield itemfirst_url = response.urlnum = response.xpath(’/html/body/div[3]/div/div[2]/div/div[1]/div[1]/em/text()’).extract_first()num = int(num)for i in range(2,num+1): next_url = ’.’.join(first_url.split(’.’)[:-1]) + ’_’ + str(i) + ’.html’ # 請求其余圖片,并用回調(diào)函數(shù)self.parse_detail解析頁面 yield scrapy.Request(next_url,callback=self.parse_detail,cookies=self.cookie) def parse_detail(self,response):'''解析圖片詳情頁面,構(gòu)建實(shí)體'''item = Win4000Item()item[’url’] = response.xpath(’/html/body/div[3]/div/div[2]/div/div[2]/div[1]/div/a/img/@src’).extract_first()index = response.xpath(’/html/body/div[3]/div/div[2]/div/div[1]/div[1]/span/text()’).extract_first()item[’name’] = response.xpath(’/html/body/div[3]/div/div[2]/div/div[1]/div[1]/h1/text()’).extract_first() + ’_’ + index + ’.jpg’yield item

修改配置文件settings.py

修改win4000/win4000/settings.py中的以下項(xiàng)。

BOT_NAME = ’win4000’SPIDER_MODULES = [’win4000.spiders’]NEWSPIDER_MODULE = ’win4000.spiders’# 圖片保存文件夾IMAGES_STORE = ’./result’# Crawl responsibly by identifying yourself (and your website) on the user-agent# 用于模仿瀏覽器行為USER_AGENT = ’Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0’# Obey robots.txt rulesROBOTSTXT_OBEY = False# Configure a delay for requests for the same website (default: 0)# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay# See also autothrottle settings and docs# 下載時(shí)延DOWNLOAD_DELAY = 3# Disable cookies (enabled by default)# 是否啟用CookieCOOKIES_ENABLED = True# Configure item pipelines# See https://docs.scrapy.org/en/latest/topics/item-pipeline.htmlITEM_PIPELINES = { ’win4000.pipelines.Win4000Pipeline’: 300,}

修改管道文件pipelines.py用于下載圖片

修改win4000/win4000/pipelines.py文件。

from itemadapter import ItemAdapterfrom scrapy.pipelines.images import ImagesPipelineimport scrapyimport osfrom scrapy.exceptions import DropItemclass Win4000Pipeline(ImagesPipeline): def get_media_requests(self, item, info):# 下載圖片,如果傳過來的是集合需要循環(huán)下載# meta里面的數(shù)據(jù)是從spider獲取,然后通過meta傳遞給下面方法:file_pathyield scrapy.Request(url=item[’url’],meta={’name’:item[’name’]}) def item_completed(self, results, item, info):# 是一個(gè)元組,第一個(gè)元素是布爾值表示是否成功if not results[0][0]: with open(’img_error_name.txt’,’a’) as f_name:error_name = str(item[’name’])f_name.write(error_name)f_name.write(’n’) with open(’img_error_url.txt’,’a’) as f_url:error_url = str(item[’url’])f_url.write(error_url)f_url.write(’n’)raise DropItem(’下載失敗’)return item # 重命名,若不重寫這函數(shù),圖片名為哈希,就是一串亂七八糟的名字 def file_path(self, request, response=None, info=None):# 接收上面meta傳遞過來的圖片名稱filename = request.meta[’name’]return filename

編寫爬蟲啟動(dòng)文件begin.py

在win4000目錄下創(chuàng)建begin.py

# win4000/begin.pyfrom scrapy import cmdlinecmdline.execute(’scrapy crawl pictures’.split())最終目錄樹 win4000 begin.py win4000 spiders __init__.py pictures.py __init__.py items.py middlewares.py pipelines.py settings.py scrapy.cfg項(xiàng)目運(yùn)行

進(jìn)入begin.py所在目錄,運(yùn)行程序,啟動(dòng)scrapy進(jìn)行爬蟲。

$ python3 begin.py爬取結(jié)果

Python爬蟲之教你利用Scrapy爬取圖片

后記

本項(xiàng)目僅用于測試用途。Enjoy coding.

到此這篇關(guān)于Python爬蟲之教你利用Scrapy爬取圖片的文章就介紹到這了,更多相關(guān)python中用Scrapy爬取圖片內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久国产精品色av免费看| 亚洲欧美日韩国产| 捆绑调教美女网站视频一区 | 免费黄网站欧美| 亚洲18在线| 精品99久久| 国产国产精品| 欧美片网站免费| 日韩欧美字幕| 一区二区三区四区日韩| 久久97视频| 国产韩日影视精品| 国产亚洲精品美女久久久久久久久久| 岛国精品一区| 亚洲作爱视频| 国产精品亚洲欧美一级在线| 伊人久久视频| 久久高清免费观看| 久久a爱视频| 国产综合精品| 国产精品美女在线观看直播| 亚洲va在线| 日韩精品中文字幕一区二区| 日韩一区电影| 日韩高清欧美激情| 日本在线精品| 国产精品一线| 99国产精品99久久久久久粉嫩| 久久成人av| 亚洲欧美久久久| 国产aⅴ精品一区二区三区久久 | 日本亚洲视频| 国际精品欧美精品| 久久亚洲欧美| 中文av在线全新| 日韩国产欧美三级| 欧美日韩在线观看视频小说| 国产美女精品视频免费播放软件| 欧美日韩国产一区二区三区不卡 | 老司机精品视频在线播放| 好看的亚洲午夜视频在线| 国产精品三级| 亚洲一区亚洲| 精品99久久| 97久久亚洲| 夜久久久久久| 电影天堂国产精品| 国产精品观看| 亚洲欧美网站在线观看| 久久久久久美女精品| 国产精品chinese| 亚洲一区二区三区久久久| 国产精品亚洲欧美日韩一区在线| 视频一区二区三区入口| 日韩一区自拍| 欧美精品1区| 日韩精品一区二区三区免费视频 | 欧美精选一区二区三区| 精品视频国产| 欧美亚洲自偷自偷| 国产一级一区二区| 日韩三区免费| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 欧美国产另类| 日韩一级网站| 国模大尺度视频一区二区| 日韩精品a在线观看91| aa国产精品| 99久久九九| 国产精品黑丝在线播放| 国产精品男女| 日韩手机在线| 天使萌一区二区三区免费观看| av一区在线| 中文av在线全新| 国产精品精品| 久久99视频| 久久国产生活片100| 亚洲三级av| 免费日韩视频| 亚洲欧美久久| 亚洲深夜影院| 国产亚洲福利| 在线国产一区二区| 欧美日韩在线二区| 欧美午夜精彩| 日韩成人a**站| 国产成人免费| 国产精品蜜芽在线观看| 激情视频网站在线播放色 | 国产乱码午夜在线视频| 高潮久久久久久久久久久久久久| 国产精品国码视频| 欧美aa在线视频| 国产精品nxnn| 久久香蕉网站| 国产成人免费精品| 正在播放日韩精品| 99久久久国产精品美女| 国产中文一区| 在线亚洲激情| 亚洲精品美女| 欧美日韩亚洲一区三区| 国产精品网址| 国产成人精品福利| 手机在线电影一区| 日韩一区二区三区免费播放| 欧美日韩尤物久久| 国产一区亚洲| 视频在线观看一区| 日韩区一区二| 国产精品自在| 高清久久一区| 99久久婷婷| 美女被久久久| 日本午夜免费一区二区| 嫩呦国产一区二区三区av| 精品国产一级| 久久裸体视频| 男人的天堂久久精品| 亚洲久久在线| 国产精品成人**免费视频| 日韩a一区二区| 婷婷激情图片久久| 亚洲综合福利| 国产精品啊v在线| 五月天av在线| 美女久久网站| 国产精品久久久网站| 久久精品国产网站| 激情六月综合| 亚洲精品第一| 麻豆91精品91久久久的内涵| 久久久久一区| 亚洲精品高潮| 国产精品羞羞答答在线观看| 超级白嫩亚洲国产第一| 香蕉国产精品| 奇米狠狠一区二区三区| 久久久久久一区二区| 91精品99| 日本午夜精品久久久| 色综合五月天| 水野朝阳av一区二区三区| 国产美女视频一区二区| 深夜视频一区二区| 中文字幕av一区二区三区人| 麻豆精品一区二区综合av| 日韩精品中文字幕吗一区二区| 欧美va天堂在线| 国产真实久久| 亚洲+小说+欧美+激情+另类| 久久av资源| 日韩一区自拍| 视频一区二区三区中文字幕| 日韩精彩视频在线观看| 久久亚洲道色| 婷婷成人基地| 日本视频中文字幕一区二区三区| 国产精品久久久久久久久久久久久久久| 高清日韩中文字幕| 午夜久久影院| 青青青免费在线视频| 久久精品国产www456c0m| 91欧美极品| 亚洲v在线看| 日韩二区在线观看| 香蕉久久99| 欧美激情aⅴ一区二区三区| 在线一区欧美| 在线亚洲人成| 欧美日韩午夜| 伊人影院久久| 国产在视频一区二区三区吞精| 日韩精品一二三| 日本免费一区二区三区四区| 青草av.久久免费一区| 亚洲网站视频| 精品入口麻豆88视频| 日韩影片在线观看| 久久精品高清| 国产一区二区三区四区| 亚洲免费一区三区| 亚洲午夜久久久久久尤物| 久久精品国产99国产| 日韩精品免费视频人成| 婷婷综合五月| 毛片在线网站| 国产精品hd| 日韩精品视频中文字幕| 亚洲黄色影院| 女生影院久久| 精品资源在线| 欧美天堂一区| 亚洲三级av| 好吊视频一区二区三区四区| 欧美成人a交片免费看| 国产精品宾馆| 欧美一区激情| 亚洲香蕉视频|