這是一個(gè)練習(xí)項(xiàng)目,這里要感謝簡(jiǎn)書的向右奔跑分蓖,從開始學(xué)習(xí)scrapy開始尔艇,跟向右奔跑老師學(xué)習(xí)了很多,這個(gè)項(xiàng)目也是向右奔跑老師的建議練習(xí)項(xiàng)目之一么鹤。
使用Scrapy ItemLoaders爬取整站圖片
在老師的基礎(chǔ)上自己做了一些修改终娃。本案例沒有用到item,setting也只有增加了USER_AGENT(有些網(wǎng)站反爬蒸甜,模擬瀏覽器)和DOWNLOAD_DELAY(設(shè)置訪問頻率)尝抖,因此直接上spider代碼(直接在代碼中說(shuō)明學(xué)習(xí)過程中遇到的問題和解決方法):
from scrapy.selector import Selector
from scrapy.spiders import CrawlSpider
from scrapy.http import Request
import re #需要用到正則表達(dá)式提取數(shù)字
import urllib.request #下載圖片的需要用到這個(gè)模塊毡们,我個(gè)人不會(huì)用pipelines下載
class MeiziSpider(CrawlSpider):
name = 'meizi'
#重寫入口
def start_requests(self): #重新寫了入口url,一開始用遞歸寫的昧辽,發(fā)現(xiàn)寫出來(lái)好多重復(fù)訪問(不會(huì)去重)衙熔,效率太低,后來(lái)改成正常的函數(shù)調(diào)用了搅荞,雖然麻煩了點(diǎn)红氯。
return [Request('http://www.meizitu.com/a/list_1_1.html',callback=self.parse)]
#訪問分頁(yè) #parse主要是提取分頁(yè)的規(guī)格,獲取分頁(yè)最大的頁(yè)碼咕痛,循環(huán)分頁(yè)訪問分頁(yè)url
def parse(self,response):
cel = Selector(response)
cel2 = cel.xpath('//div[@id="wp_page_numbers"]/ul/li')
for info in cel2:
text = info.xpath('a/text()').extract()
if len(text):
text = text[0]
if text == '末頁(yè)':
page = info.xpath('a/@href').extract()[0] #xpath獲得的是list痢甘,需要加[0]
page = re.findall(r'list_1_(\d+).html',page)[0] #獲得最大的頁(yè)碼,用到re模塊茉贡,findall獲得的是list塞栅,需要加[0]
break
for each in range(int(page)):
pageurl = 'http://www.meizitu.com/a/list_1_%s.html'% str(each+1)
print(pageurl)
yield Request(url=pageurl,callback=self.sceond_parse)
#訪問第二層頁(yè)面
def sceond_parse(self,response):
cel = Selector(response)
cel1 = cel.xpath('//ul[@class="wp-list clearfix"]/li/div/div/a/@href').extract()
for info in cel1: for循環(huán)分頁(yè)訪問分頁(yè)上縮略圖片的詳細(xì)地址,獲得詳細(xì)圖片的url腔丧,并訪問
image_url = info
yield Request(url=image_url,callback=self.image_urlparse)
#保存圖片
def image_urlparse(self,response):
cel = Selector(response)
name = cel.xpath('//div[@id="picture"]/p/img/@alt').extract()
pic = cel.xpath('//div[@id="picture"]/p/img/@src').extract()
for i in range(len(name)):
print(name[i],pic[i]) #測(cè)試用
#以下代碼是模擬瀏覽器放椰,urllib模塊的headers需要單獨(dú)增加,settings中的headers對(duì)urllib無(wú)效愉粤。
opener=urllib.request.build_opener()
opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36')]
urllib.request.install_opener(opener)
#以下代碼保存圖片砾医。
try:
urllib.request.urlretrieve(pic[i],r'C:\Users\ABC\Desktop\meizi\pic\%s.jpg'% name[i]) #下載到后面的page時(shí)發(fā)現(xiàn)每張圖片的名字一樣,導(dǎo)致后面的圖片會(huì)把之前的圖片覆蓋衣厘,name還需要重新修改如蚜,以后有時(shí)間在修改。
except:
print('--no---image--')
效果:
存在的問題:
1.重復(fù)命名:后面分頁(yè)圖片地址對(duì)應(yīng)的name一樣影暴,導(dǎo)致會(huì)少掉很多圖片错邦,后續(xù)要重寫命名規(guī)則。
![`4KW)BQFAQ3Q62(NM47T]6P.png](http://upload-images.jianshu.io/upload_images/4568344-ba5463e22a3f702e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2.還不會(huì)使用pipelines下載型宙。
3.此站不需要登陸兴猩,沒有涉及到模擬登陸的內(nèi)容,后續(xù)需要繼續(xù)學(xué)習(xí)的內(nèi)容早歇。
4.解析網(wǎng)站花了好多時(shí)間,對(duì)網(wǎng)站結(jié)構(gòu)不是很清楚讨勤,xpath也不是很熟悉箭跳,使用的時(shí)候經(jīng)常出現(xiàn)問題。