??在用Python的urllib和BeautifulSoup寫過了很多爬蟲之后泣栈,本人決定嘗試著名的Python爬蟲框架——Scrapy.
??本次分享將詳細(xì)講述如何利用Scrapy來下載豆瓣電影Top250, 主要解決的問題有:
- 如何利用ImagesPipeline來下載圖片
- 如何對下載后的圖片重命名畏纲,這是因為Scrapy默認(rèn)用Hash值來保存文件信殊,這并不是我們想要的
??首先我們要爬取的豆瓣電影Top250網(wǎng)頁截圖如下:
??網(wǎng)頁的結(jié)構(gòu)并不復(fù)雜靖秩,所以讨衣,我們決定把所有的250部電影的圖片都下載下來授药。接下來徐钠,就開始我們的Scrapy之旅啦~~
??首先我們新建一個Scrapy項目戳粒,叫做doubanMovie.
scrapy startproject doubanMovie
該項目的文件樹形結(jié)構(gòu)如下:
??修改items.py如下:
# -*- coding: utf-8 -*-
import scrapy
class DoubanmovieItem(scrapy.Item):
# two items: url and name of image
url = scrapy.Field()
img_name = scrapy.Field()
這是我們用來存放圖片的url和name的部分毙籽。
??接著洞斯,在spiders文件夾下,新建爬蟲(Spider)文件:doubanMovieSpider.py, 文件代碼如下:
import scrapy
from scrapy.spiders import Spider
from scrapy.selector import Selector
from doubanMovie.items import DoubanmovieItem
class movieSpider(Spider):
# name of Spider
name = "movie"
#start urls
start_urls = ["https://movie.douban.com/top250"]
for i in range(1,10):
start_urls.append("https://movie.douban.com/top250?start=%d&filter="%(25*i))
#parse function
def parse(self, response):
item = DoubanmovieItem()
sel = Selector(response)
images = sel.xpath('//*[@id="content"]/div/div[1]/ol/li')
item['url'] = []
item['img_name'] = []
# append the url and name of the image in item
for image in images:
# extract url and name of the image
site = image.xpath('div/div[1]/a/img/@src').extract_first()
img_name = image.xpath('div/div[1]/a/img/@alt').extract_first()
item['url'].append(site)
item['img_name'].append(img_name)
yield item
該部分代碼主要利用xpath來提出網(wǎng)頁中的電影圖片的url和name坑赡,并添加到item中烙如。
??為了能夠?qū)ο螺d后的圖片進(jìn)行重命名,我們需要修改pipeline.py文件毅否,代碼如下:
# -*- coding: utf-8 -*-
from scrapy.pipelines.images import ImagesPipeline
from scrapy.http import Request
class DoubanmoviePipeline(object):
def process_item(self, item, spider):
return item
class MyImagesPipeline(ImagesPipeline):
# yield meta for file_path() function
def get_media_requests(self, item, info):
for url in item['url']:
yield Request(url, meta={'item': item, 'index':item['url'].index(url)})
# rename the image
def file_path(self, request, response=None, info=None):
item = request.meta['item']
index = request.meta['index']
image_name = item['img_name'][index]
return 'full/%s.jpg' % (image_name)
在這兒我們添加了MyImagesPipeline類亚铁,主要目的是用來對下載后的圖片進(jìn)行重命名。
??最后一步螟加,也是關(guān)鍵的一步徘溢,就是修改settings.py文件吞琐,將其中的ROBOTSTXT_OBEY設(shè)置為False, 這是為了防止爬蟲被禁,并且添加以下代碼:
USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0"
ITEM_PIPELINES {'doubanMovie.pipelines.DoubanmoviePipeline': 2,
'doubanMovie.pipelines.MyImagesPipeline':1 }
IMAGES_URLS_FIELD = 'url'
IMAGES_STORE = r'.'
在上面的代碼中然爆,我們設(shè)置了USER_AGENT, 這是為了在Linux系統(tǒng)中模擬瀏覽器的設(shè)置站粟,讀者可以根據(jù)自己的系統(tǒng)和瀏覽器來設(shè)置不同的USER_AGENT. 同時, 我們又加了ITEM_PIPELINES管道和圖片的保存路徑曾雕。
??一切就緒奴烙,我們就可以運(yùn)行爬蟲啦。切換到spiders文件夾下翻默,輸入scrapy list可以查看爬蟲的名字缸沃,輸入scrapy crawl movie即可運(yùn)行爬蟲。
??movie爬蟲的運(yùn)行結(jié)果如下:
該爬蟲下載了250個文件修械,用時約13秒趾牧,效率驚人啊肯污!
??下載后的圖片保存在當(dāng)前文件夾(spiders)下的full文件夾下翘单,我們來看一下里面的內(nèi)容:
??Surprise!Wonderful! 里面有沒有你喜歡的電影呢?
??本項目的Github地址為 https://github.com/percent4/doubanMovieSpider蹦渣, 歡迎大家訪問哦~~