您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Python爬蟲利用scrapy創建項目,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
一、安裝scrapy
1.1linux系統使用:pip install scrapy
1.2Windows系統:
pip install wheel
下載twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted (根據Python的版本進行下載,這里我的Python版本是3.7所以就下的3.7)
pip install 路徑\Twisted-19.2.1-cp37-cp37m-win_amd64 pip install pywin32 pip install scrapy
環境:Windows 7 x64 Python3.7.1 pycharm
二、創建scrapy項目
1、新建一個項目,選擇Python即可。我這里創建的項目名是demo。創建好后是一個空的項目。
2、點擊pycharm下面的terminal,如下圖所示:
在終端中輸入:scrapy startproject demo 命令,創建scrapy項目,創建成功后會出現如下目錄結構:
各文件作用大致如下:
scrapy.cfg::項目的配置文件
demo/:該項目的python模塊。在此加入代碼。
demo/items.py:項目中的item文件主要用于定義數據的結構化存儲,類似于ORM中的models。
demo/pipelines.py:項目中的pipelines文件,指定數據的存儲方式(以文件的形式存儲,存儲到數據庫中)。
demo/settings.py:項目的設置文件.
demo/spiders/:放置spider代碼的目錄。我們寫的爬蟲代碼在這個目錄下。
3、創建爬蟲文件
3.1在終端中輸入:cd demo(我這里輸入demo是因為我的項目名是demo)
3.2在終端中輸入:scrapy genspider books books.toscrape.com (scrapy genspider 應用名稱 爬取網頁的起始url)
4、打開books文件,該文件結構如下:
5、爬取http://books.toscrape.com/的書籍信息。
5.1分析http://books.toscrape.com/頁面。
由上圖我們可以知道所有書籍都存放在div/ol/下的li標簽中。這里我們只打印書名,由此我們可以像下面這樣寫來提取數據。
5.2books中的部分代碼如下:
def parse(self, response): ''' 數據解析,提取。 :param response: 爬取到的response對象 :return: ''' book_list = response.xpath('/html/body/div/div/div/div/section/div[2]/ol/li') for book in book_list: print(book.xpath('./article/div[1]/a/img/@alt').extract())
5.3在setting.py中配置如下:
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0' # UA頭 ROBOTSTXT_OBEY = False # 如果為True表示準信robots協議,則大多數數據都爬不了。所以這里設置為Flase LOG_LEVEL = 'ERROR' # 日志等級
5.4在終端中執行爬取命令:
scrapy crawl books
打印內容如下
['A Light in the Attic'] ['Tipping the Velvet'] ['Soumission'] ['Sharp Objects'] ['Sapiens: A Brief History of Humankind'] ['The Requiem Red'] ['The Dirty Little Secrets of Getting Your Dream Job'] ['The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhull'] ['The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics'] ['The Black Maria'] ['Starving Hearts (Triangular Trade Trilogy, #1)'] ["Shakespeare's Sonnets"] ['Set Me Free'] ["Scott Pilgrim's Precious Little Life (Scott Pilgrim #1)"] ['Rip it Up and Start Again'] ['Our Band Could Be Your Life: Scenes from the American Indie Underground, 1981-1991'] ['Olio'] ['Mesaerion: The Best Science Fiction Stories 1800-1849'] ['Libertarianism for Beginners'] ["It's Only the Himalayas"]
由此我們可以看出這里只是爬取了1頁,下面來爬取所有書籍名稱。
6、爬取所有頁面的書籍。
最終books.py的內容看起來像下面這樣:
# -*- coding: utf-8 -*- import scrapy class BooksSpider(scrapy.Spider): name = 'books' # 爬蟲的唯一標識 allowed_domains = ['books.toscrape.com'] # 要爬取的起點,可以是多個。 start_urls = ['http://books.toscrape.com/'] url = 'http://books.toscrape.com/catalogue/page-%d.html' # url模板用于拼接新的url page_num = 2 def parse(self, response): ''' 數據解析,提取。 :param response: 爬取到的response對象 :return: ''' print(f'當前頁數{self.page_num}') # 打印當前頁數的數據 book_list = response.xpath('/html/body/div/div/div/div/section/div[2]/ol/li') for book in book_list: print(book.xpath('./article/div[1]/a/img/@alt').extract()) if self.page_num < 50: # 總共50頁的內容 new_url = format(self.url % self.page_num) # 拼接處新的URL self.page_num += 1 # 頁數加1 yield scrapy.Request(url=new_url, callback=self.parse) # 手動發送請求
在終端中執行命令獲取書名:
scrapy crawl books
如果一切順利你會看到打印的最終部分結果如下:
今日小結:
(1)創建scrapy項目:scrapy startproject 爬蟲項目名稱。
(2)創建爬蟲應用:scrapy genspider books books.toscrape.com ((scrapy genspider 應用名稱 爬取網頁的起始url))應用名稱在整個項目中作為唯一標識,不能出現同名的爬蟲應用。
(3)運行爬蟲程序:scrapy crawl books(scrapy crawl 爬蟲應用)。
(4)parse方法:當一個頁面下載完成后,Scrapy引擎會回調一個我們指定的頁面解析函數(默認為parse方法)解析頁面。
一個頁面解析函數通常需要完成以下兩個任務:
1、提取頁面中的數據(使用XPath或CSS選擇器)。
2、提取頁面中的鏈接,并產生對鏈接頁面的下載請求。
頁面解析函數通常被實現成一個生成器函數,每一項從頁面中提取的數據以及每一個對鏈接頁面的下載請求都由yield語句提交給Scrapy引擎。
parse方法的工作機制:
(1)因為使用的yield,而不是return。parse函數將會被當做一個生成器使用。scrapy會逐一獲取parse方法中生成的結果,并判斷該結果是一個什么樣的類型;
(2)如果是request則加入爬取隊列,如果是item類型則使用pipeline處理,其他類型則返回錯誤信息。
(3)scrapy取到第一部分的request不會立馬就去發送這個request,只是把這個request放到隊列里,然后接著從生成器里獲取;
(4)取盡第一部分的request,然后再獲取第二部分的item,取到item了,就會放到對應的pipeline里處理;
(5)parse()方法作為回調函數(callback)賦值給了Request,指定parse()方法來處理這些請求 scrapy.Request(url, callback=self.parse)
(6)Request對象經過調度,執行生成 scrapy.http.response()的響應對象,并送回給parse()方法,直到調度器中沒有Request(遞歸的思路)
(7)取盡之后,parse()工作結束,引擎再根據隊列和pipelines中的內容去執行相應的操作;
(8)程序在取得各個頁面的items前,會先處理完之前所有的request隊列里的請求,然后再提取items。
(9)這一切的一切,Scrapy引擎和調度器將負責到底。
以上就是Python爬蟲利用scrapy創建項目,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。