本人如今是一個學生,平時主要用的是Java,業餘時間學習了Python,在提升本身的同時,想把本身學習過程記錄下來,但願能夠幫到更多入門的同窗們。css
PyCharmhtml
Python3.6python
Scrapyweb
在你的工做目錄的文件夾下打開命令提示符窗口,輸入:瀏覽器
scrapy startproject demo
若是出現下面的提示,則說明建立成功。app
使用PyCharm打開這個scrapy項目,它的目錄結構是這樣的:框架
scrapy.cfg文件中主要包含的是項目的相關設置。scrapy
demo文件夾下是用於編寫爬蟲的目錄。ide
items.py:定義咱們所要爬取的信息的相關屬性。工具
middlewares.py:爬蟲中間件,這裏能夠用過自定義相關的方法,用來處理爬蟲的響應和請求。
pipelines.py:當數據被爬蟲爬取下來後,它會被髮送到item pipelines中,每一個item pipelines組件(有時稱爲「項目管道」)是一個實現簡單方法的Python類。他們收到一個項目並對其執行操做,還決定該項目是否應該繼續經過管道或被丟棄而且再也不被處理。
settings.py:項目的設置文件。
在spiders文件夾下建立douban_spider.py文件
這是一個空的.py文件,而後在這編寫爬蟲代碼。
# 爬蟲類須要繼承scrapy下的Spider類。 import scrapy class douban_movie_spider(scrapy.Spider): # 項目的啓動名 name = "douban_movie" # 若是網站設置有防爬措施,須要添加上請求頭信息,否則會爬取不到任何數據 headler = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 ' 'Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' } # 開始連接 start_urls = [ 'https://movie.douban.com/top250' ] # start_requests方法爲scrapy的方法,咱們對它進行重寫。 def start_requests(self): # 將start_url中的連接經過for循環進行遍歷。 for url in self.start_urls: # 經過yield發送Request請求。 # 這裏的Reques注意是scrapy下的Request類。注意不到導錯類了。 # 這裏的有3個參數: # 一、url爲遍歷後的連接 # 二、callback爲發送完請求後經過什麼方法進行處理,這裏經過parse方法進行處理。 # 三、若是網站設置了防爬措施,須要加上headers假裝瀏覽器發送請求。 yield scrapy.Request(url=url, callback=self.parse, headers=self.headler) # 重寫parse對start_request()請求到的數據進行處理 def parse(self, response): pass
打開https://movie.douban.com/top250,點擊f12開發者工具。
使用選取工具選取整個電影的信息,能夠發現,全部的信息都是放在單獨的一個li標籤中的,並且在li下還有一個class爲item的div包裹着全部的信息。
def parse(self, response): # 這裏使用scrapy的css選擇器,既然數據在class爲item的div下,那麼把選取範圍定位div.item for quote in response.css('div.item'): # 經過yield對網頁數據進行循環抓取,咱們要抓取的內容有3個,分別以下 yield { "電影名": quote.css('div.info div.hd a span.title::text').extract_first(), "評分":quote.css('div.info div.bd div.star span.rating_num::text').extract(), "引言": quote.css('div.info div.bd p.quote span.inq::text').extract() }
寫完上面的代碼,其實只是抓取一頁的罷了,爲了抓取完整的top250榜單,咱們須要讓爬蟲跳轉到下一頁再進行循環抓取,由於每一個頁面的結構是同樣的,因此不用擔憂會抓取不到。
next_url=response.css('div.paginator span.next a::attr(href)').extract()
而後,須要對next_url進行判斷是否存在,而後再次發送Request請求。這樣爬蟲就會在爬完一個頁面後點擊下一頁再繼續爬去,往復循環,直到爬取完畢。
if next_url: next_url="https://movie.douban.com/top250"+next_url[0] print(next_url) yield scrapy.Request(next_url,headers=self.headler)
那麼到這裏,代碼就寫完了。
而後咱們來運行一下這個爬蟲,scrapy框架是經過命令來啓動爬蟲的,
在項目根目錄下打開命令提示符,輸入:
scrapy crawl douban_movie -o douban_movice.csvscrapy會把爬取到的結果保存到douban_movice.csv這個文件裏。
爬蟲運行後,就會輸出大量的日誌信息和爬去的網頁的內容。
數據會保存在douban_movice.csv這個文件中。
可是,有個問題,若是爬蟲報錯了怎麼辦?
由於使用命令啓動的爬蟲,因此爬蟲的日誌信息都是顯示在cmd中的,這樣日誌信息閱讀起來很是的不友好。因此咱們須要寫一個啓動爬蟲的python腳本,這樣日誌信息就會輸出在python環境下了
新建一個run.py文件,代碼以下:
from scrapy import cmdline name='douban_movie -o douban.csv' cmd = 'scrapy crawl {0}'.format(name) cmdline.execute(cmd.split())
而後運行這個文件,因此的日誌信息就輸出在Python環境下,便於調試。
運行獲得的結果都是同樣的。
完整的代碼是這樣的:
import scrapy class douban_movie_spider(scrapy.Spider): name = "douban_movie" headler = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 ' 'Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' } start_urls = [ 'https://movie.douban.com/top250' ] def start_requests(self): for url in self.start_urls: yield scrapy.Request(url=url, callback=self.parse, headers=self.headler) def parse(self, response): for quote in response.css('div.item'): yield { "電影名": quote.css('div.info div.hd a span.title::text').extract_first(), "評分":quote.css('div.info div.bd div.star span.rating_num::text').extract(), "引言": quote.css('div.info div.bd p.quote span.inq::text').extract() } next_url=response.css('div.paginator span.next a::attr(href)').extract() if next_url: next_url="https://movie.douban.com/top250"+next_url[0] print(next_url) yield scrapy.Request(next_url,headers=self.headler)
好了,本教程到此結束。