scrapy安裝以及簡單使用
-
1.進入終端,輸入命令
pip install scrapy
安裝模塊。安裝成功后,新建一個項目,輸入命令scrapy startproject douban
,這樣就能看到一個douban文件夾击纬,目錄結構如下:
介紹下各個文件的作用
scrapy.cfg:項目的配置文件
douban/items.py:項目的items文件
douban/pipelines.py:項目的pipelines文件
douban/settings.py:項目的設置文件
douban/spiders/:存儲爬蟲的目錄
明確在Item中需要爬取的數(shù)據(jù)
-
1.抓取豆瓣電影的片名(movie_name)、導演(movie_director)钾麸、編劇(movie_writer)更振、演員(movie_actor)炕桨、上映日期(movie_date)、片長(movie_long)肯腕、電影描述(movie_description)献宫。在scrapy中,Item是用來加載抓取內(nèi)容的容器实撒,類似于python中的字典姊途。比如movie_name就像字典中的鍵,爬取到的數(shù)據(jù)就是字典中的值知态。
制作爬蟲
-
2.1 制作爬蟲分成兩步:先爬后取捷兰,首先獲取網(wǎng)頁的所有內(nèi)容,然后取出對我們有用的部分负敏。下面寫一只爬蟲贡茅,命名為DoubanSpider.py保存在douban\spiders目錄下,代碼如下:
name是唯一的命名其做,運行scrapy crawl douban
這里的douban就是這個name,allow_domains
是搜索的域名范圍顶考,這里的start_urls
為空,在后面的函數(shù)會進行填充庶柿。 2.2 很多情況下我們是直接在
start_urls
中存入的頁面url,但是這里我們爬取的鏈接有很多而且是有規(guī)律的村怪。那么解釋下start_requests
這個方法是干什么的:
def start_requests(self):
for url in self.start_urls:
yield self.make_requests_from_url(url) #可見是從start_urls中讀取鏈接秽浇,使用make_requests_from_url生產(chǎn)Request
可見`start_requests` 是系統(tǒng)默認調(diào)用的浮庐,我們可以重寫這個函數(shù),根據(jù)需求定制自己的start_urls柬焕。豆瓣電影的url是`http://movie.douban.com/subject_search?search_text=` +`電影名`审残。這里定制了請求頭,不加請求頭發(fā)現(xiàn)訪問404錯誤
![](http://upload-images.jianshu.io/upload_images/4300291-53a53b5cbd377c38?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
-
2.3 parse函數(shù)斑举,上面執(zhí)行了請求搅轿,回調(diào)函數(shù)即為parser。scrapy幫助我們處理Request請求富玷,會獲得請求的url網(wǎng)站的響應response,我們重寫parser函數(shù):
在這個函數(shù)中我們獲得電影的url鏈接璧坟,使用的是xpath方法,同樣也可以使用css方法赎懦,語法可以查詢http://www.w3school.com這個網(wǎng)站雀鹃。獲得url后繼續(xù)發(fā)送Request請求,回調(diào)函數(shù)是自定義的parse_movie函數(shù)励两。 -
2.4 在回調(diào)函數(shù)parse_movie中我們真正抓取我們要的數(shù)據(jù)黎茎,這里進入的就是電影的具體界面,使用的仍然是xpath方法当悔。作為一只爬蟲傅瞻,Spider希望將其抓取的數(shù)據(jù)存放到Item zhong ,這里定義了前面的DoubanItem對象踢代,把爬取到的內(nèi)容存入到該對象中。
運行命令scrapy crawl douban
就能在終端看到打印出的數(shù)據(jù)
存儲內(nèi)容
-
1.保存信息有4種方式:json,json lines,csv,xml嗅骄。假如這里用json導出胳挎,命令如下:
scrapy crawl douban -o items.json -t json
-o后面是導出文件名,-t后面是導出類型
- 2.當Item在Spider中被收集之后掸读,將會被傳遞到Item Pipeline,一些組件會按照一定的順序執(zhí)行對Item處理串远。我們要編寫自己的item pipeline,每個item pipeline都是個獨立的python類,必須實現(xiàn)process_item(self, item, spider)方法儿惫。
* item(Item對象) - 被爬取的item
* spider(Spider對象) -爬取該item的spider
![](http://upload-images.jianshu.io/upload_images/4300291-db26008b29c8f8af?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
將所有的item存儲到items.json文件中澡罚,每行包含一個序列化為json格式的item,且參數(shù)ensure_ascii=False解決了json格式的中文編碼問題。
- 3.啟動一個Item Pipeline 組件肾请,你必須將它的類添加到 ITEM_PIPELINES 配置留搔,修改settings.py配置文件,加入如下,:
![](http://upload-images.jianshu.io/upload_images/4300291-93b9d42ad74b9558?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
按照工程名.pipelines.自定義pipeline組建類名格式編寫铛铁,后面的數(shù)字通常定義在0-1000之間隔显。
- 4.至此整個豆瓣爬蟲制作完成,在終端進入目錄運行`scrapy crawl douban` 饵逐,items.json文件中就保持了我們抓取到的item括眠。內(nèi)容如下,想要多抓的話在電影文本里多加幾個電影名:
![](http://upload-images.jianshu.io/upload_images/4300291-0caf851595f523b7?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)