Python爬蟲利用scrapy創(chuàng)建項(xiàng)目

本篇文章給大家分享的是有關(guān)Python爬蟲利用scrapy創(chuàng)建項(xiàng)目,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

目前成都創(chuàng)新互聯(lián)公司已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、鐵東網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

一、安裝scrapy

1.1linux系統(tǒng)使用:pip install scrapy

1.2Windows系統(tǒng):

pip install wheel

下載twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted  (根據(jù)Python的版本進(jìn)行下載,這里我的Python版本是3.7所以就下的3.7)

pip install 路徑\Twisted-19.2.1-cp37-cp37m-win_amd64
pip install pywin32
pip install scrapy

環(huán)境:Windows 7  x64   Python3.7.1  pycharm

二、創(chuàng)建scrapy項(xiàng)目

1、新建一個(gè)項(xiàng)目,選擇Python即可。我這里創(chuàng)建的項(xiàng)目名是demo。創(chuàng)建好后是一個(gè)空的項(xiàng)目。

2、點(diǎn)擊pycharm下面的terminal,如下圖所示:

Python爬蟲利用scrapy創(chuàng)建項(xiàng)目

在終端中輸入:scrapy startproject demo 命令,創(chuàng)建scrapy項(xiàng)目,創(chuàng)建成功后會(huì)出現(xiàn)如下目錄結(jié)構(gòu):

Python爬蟲利用scrapy創(chuàng)建項(xiàng)目

各文件作用大致如下:

scrapy.cfg::項(xiàng)目的配置文件

demo/:該項(xiàng)目的python模塊。在此加入代碼。

demo/items.py:項(xiàng)目中的item文件主要用于定義數(shù)據(jù)的結(jié)構(gòu)化存儲(chǔ),類似于ORM中的models。

demo/pipelines.py:項(xiàng)目中的pipelines文件,指定數(shù)據(jù)的存儲(chǔ)方式(以文件的形式存儲(chǔ),存儲(chǔ)到數(shù)據(jù)庫(kù)中)。

demo/settings.py:項(xiàng)目的設(shè)置文件.

demo/spiders/:放置spider代碼的目錄。我們寫的爬蟲代碼在這個(gè)目錄下。

3、創(chuàng)建爬蟲文件

3.1在終端中輸入:cd demo(我這里輸入demo是因?yàn)槲业捻?xiàng)目名是demo)

3.2在終端中輸入:scrapy genspider books books.toscrape.com  (scrapy genspider  應(yīng)用名稱 爬取網(wǎng)頁(yè)的起始url)

Python爬蟲利用scrapy創(chuàng)建項(xiàng)目

4、打開books文件,該文件結(jié)構(gòu)如下:

Python爬蟲利用scrapy創(chuàng)建項(xiàng)目

5、爬取http://books.toscrape.com/的書籍信息。

5.1分析http://books.toscrape.com/頁(yè)面。

Python爬蟲利用scrapy創(chuàng)建項(xiàng)目

由上圖我們可以知道所有書籍都存放在div/ol/下的li標(biāo)簽中。這里我們只打印書名,由此我們可以像下面這樣寫來提取數(shù)據(jù)。

Python爬蟲利用scrapy創(chuàng)建項(xiàng)目

5.2books中的部分代碼如下:

def parse(self, response):
        '''
        數(shù)據(jù)解析,提取。
        :param response: 爬取到的response對(duì)象
        :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表示準(zhǔn)信robots協(xié)議,則大多數(shù)數(shù)據(jù)都爬不了。所以這里設(shè)置為Flase
LOG_LEVEL = 'ERROR'  # 日志等級(jí)

5.4在終端中執(zhí)行爬取命令:

scrapy crawl books

打印內(nèi)容如下

['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頁(yè),下面來爬取所有書籍名稱。

6、爬取所有頁(yè)面的書籍。

Python爬蟲利用scrapy創(chuàng)建項(xiàng)目

最終books.py的內(nèi)容看起來像下面這樣:

# -*- coding: utf-8 -*-
import scrapy
class BooksSpider(scrapy.Spider):
    name = 'books'  # 爬蟲的唯一標(biāo)識(shí)
    allowed_domains = ['books.toscrape.com']
    # 要爬取的起點(diǎn),可以是多個(gè)。
    start_urls = ['http://books.toscrape.com/']
    url = 'http://books.toscrape.com/catalogue/page-%d.html'   # url模板用于拼接新的url
    page_num = 2
    def parse(self, response):
        '''
        數(shù)據(jù)解析,提取。
        :param response: 爬取到的response對(duì)象
        :return:
        '''
        print(f'當(dāng)前頁(yè)數(shù){self.page_num}')  # 打印當(dāng)前頁(yè)數(shù)的數(shù)據(jù)
        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頁(yè)的內(nèi)容
            new_url = format(self.url % self.page_num)  # 拼接處新的URL
            self.page_num += 1  # 頁(yè)數(shù)加1
            yield scrapy.Request(url=new_url, callback=self.parse)  # 手動(dòng)發(fā)送請(qǐng)求

在終端中執(zhí)行命令獲取書名:

scrapy crawl books

如果一切順利你會(huì)看到打印的最終部分結(jié)果如下:

Python爬蟲利用scrapy創(chuàng)建項(xiàng)目

今日小結(jié):

(1)創(chuàng)建scrapy項(xiàng)目:scrapy startproject 爬蟲項(xiàng)目名稱。

(2)創(chuàng)建爬蟲應(yīng)用:scrapy genspider books books.toscrape.com ((scrapy genspider  應(yīng)用名稱 爬取網(wǎng)頁(yè)的起始url))應(yīng)用名稱在整個(gè)項(xiàng)目中作為唯一標(biāo)識(shí),不能出現(xiàn)同名的爬蟲應(yīng)用。

(3)運(yùn)行爬蟲程序:scrapy crawl books(scrapy  crawl  爬蟲應(yīng)用)。

(4)parse方法:當(dāng)一個(gè)頁(yè)面下載完成后,Scrapy引擎會(huì)回調(diào)一個(gè)我們指定的頁(yè)面解析函數(shù)(默認(rèn)為parse方法)解析頁(yè)面。

一個(gè)頁(yè)面解析函數(shù)通常需要完成以下兩個(gè)任務(wù):

1、提取頁(yè)面中的數(shù)據(jù)(使用XPath或CSS選擇器)。

2、提取頁(yè)面中的鏈接,并產(chǎn)生對(duì)鏈接頁(yè)面的下載請(qǐng)求。

頁(yè)面解析函數(shù)通常被實(shí)現(xiàn)成一個(gè)生成器函數(shù),每一項(xiàng)從頁(yè)面中提取的數(shù)據(jù)以及每一個(gè)對(duì)鏈接頁(yè)面的下載請(qǐng)求都由yield語句提交給Scrapy引擎。

parse方法的工作機(jī)制:

(1)因?yàn)槭褂玫膟ield,而不是return。parse函數(shù)將會(huì)被當(dāng)做一個(gè)生成器使用。scrapy會(huì)逐一獲取parse方法中生成的結(jié)果,并判斷該結(jié)果是一個(gè)什么樣的類型;

(2)如果是request則加入爬取隊(duì)列,如果是item類型則使用pipeline處理,其他類型則返回錯(cuò)誤信息。

(3)scrapy取到第一部分的request不會(huì)立馬就去發(fā)送這個(gè)request,只是把這個(gè)request放到隊(duì)列里,然后接著從生成器里獲?。?/p>

(4)取盡第一部分的request,然后再獲取第二部分的item,取到item了,就會(huì)放到對(duì)應(yīng)的pipeline里處理;

(5)parse()方法作為回調(diào)函數(shù)(callback)賦值給了Request,指定parse()方法來處理這些請(qǐng)求 scrapy.Request(url, callback=self.parse)

(6)Request對(duì)象經(jīng)過調(diào)度,執(zhí)行生成 scrapy.http.response()的響應(yīng)對(duì)象,并送回給parse()方法,直到調(diào)度器中沒有Request(遞歸的思路)

(7)取盡之后,parse()工作結(jié)束,引擎再根據(jù)隊(duì)列和pipelines中的內(nèi)容去執(zhí)行相應(yīng)的操作;

(8)程序在取得各個(gè)頁(yè)面的items前,會(huì)先處理完之前所有的request隊(duì)列里的請(qǐng)求,然后再提取items。

(9)這一切的一切,Scrapy引擎和調(diào)度器將負(fù)責(zé)到底。

以上就是Python爬蟲利用scrapy創(chuàng)建項(xiàng)目,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁(yè)標(biāo)題:Python爬蟲利用scrapy創(chuàng)建項(xiàng)目
網(wǎng)頁(yè)鏈接:http://muchs.cn/article40/pdjpho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站維護(hù)網(wǎng)站內(nèi)鏈、自適應(yīng)網(wǎng)站、電子商務(wù)ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司