国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Scrapy簡介-快速開始-項(xiàng)目實(shí)戰(zhàn)-注意事項(xiàng)-踩坑之路

這篇具有很好參考價(jià)值的文章主要介紹了Scrapy簡介-快速開始-項(xiàng)目實(shí)戰(zhàn)-注意事項(xiàng)-踩坑之路。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

scrapy項(xiàng)目模板地址:https://github.com/w-x-x-w/Spider-Project

Scrapy簡介

Scrapy是什么?

  • Scrapy是一個(gè)健壯的爬蟲框架,可以從網(wǎng)站中提取需要的數(shù)據(jù)。是一個(gè)快速、簡單、并且可擴(kuò)展的方法。Scrapy使用了異步網(wǎng)絡(luò)框架來處理網(wǎng)絡(luò)通訊,可以獲得較快的下載速度,因此,我們不需要去自己實(shí)現(xiàn)異步框架。并且,Scrapy包含了各種中間件接口,可以靈活的完成各種需求。所以我們只需要定制開發(fā)幾個(gè)模塊就可以輕松的實(shí)現(xiàn)一個(gè)爬蟲,用來抓取網(wǎng)頁上的各種內(nèi)容。
  • Scrapy并不是一個(gè)爬蟲,它只是一個(gè)“解決方案”,也就是說,如果它訪問到一個(gè)“一無所知”的網(wǎng)站,是什么也做不了的。Scrapy是用于提取結(jié)構(gòu)化信息的工具,即需要人工的介入來配置合適的XPath或者CSS表達(dá)式。Scrapy也不是數(shù)據(jù)庫,它并不會儲存數(shù)據(jù),也不會索引數(shù)據(jù),它只能從一堆網(wǎng)頁中抽取數(shù)據(jù),但是我們卻可以將抽取的數(shù)據(jù)插入到數(shù)據(jù)庫中。

Scrapy架構(gòu)

Scrapy簡介-快速開始-項(xiàng)目實(shí)戰(zhàn)-注意事項(xiàng)-踩坑之路,Python,爬蟲,爬蟲實(shí)戰(zhàn)小項(xiàng)目,scrapy

Scrapy Engine (引擎): 是框架的核心,負(fù)責(zé)Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數(shù)據(jù)傳遞等。并在發(fā)生相應(yīng)的動作時(shí)觸發(fā)事件。
**Scheduler (調(diào)度器): **它負(fù)責(zé)接受引擎發(fā)送過來的Request請求,并按照一定的方式進(jìn)行整理排列,入隊(duì),當(dāng)引擎需要時(shí),提供給引擎。
**Downloader (下載器):**負(fù)責(zé)下載引擎發(fā)送的所有Requests請求,并將其獲取到的Responses交還給引擎。
**Spider (爬蟲):**負(fù)責(zé)處理由下載器返回的Responses,并且從中分析提取數(shù)據(jù),獲取Item字段需要的數(shù)據(jù),并將需要跟進(jìn)的URL提交給Scrapy Engine,并且再次進(jìn)入Scheduler。
**Item Pipeline (項(xiàng)目管道):**它負(fù)責(zé)處理Spider中獲取到的Item,并進(jìn)行進(jìn)行后期處理(清理、驗(yàn)證、持久化存儲)的地方.
**Downloader Middlewares (下載中間件):**引擎與下載器間的特定鉤子,一個(gè)可以自定義擴(kuò)展下載功能的組件。處理下載器傳遞給引擎的Response。
**Spider Middlewares(爬蟲中間件):**引擎和Spider間的特定鉤子,(處理進(jìn)入Spider的Responses,和從Spider出去的Requests)

快速開始-項(xiàng)目實(shí)戰(zhàn)

我們這里以某新聞網(wǎng)站新聞推送為例編寫項(xiàng)目,僅用于學(xué)習(xí),請勿惡意使用

安裝 Scrapy

pip install Scrapy

創(chuàng)建項(xiàng)目

scrapy startproject 項(xiàng)目名
HuxiuSpider/
    scrapy.cfg
    HuxiuSpider/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...

這些文件分別是:

  • scrapy.cfg: 項(xiàng)目的配置文件
  • HuxiuSpider/: 該項(xiàng)目的python模塊。之后您將在此加入代碼。
  • HuxiuSpider/items.py: 項(xiàng)目中的item文件.
  • HuxiuSpider/pipelines.py: 項(xiàng)目中的pipelines文件.
  • HuxiuSpider/settings.py: 項(xiàng)目的設(shè)置文件.
  • HuxiuSpider/spiders/: 放置spider代碼的目錄.

更改設(shè)置

  • 注釋robotstxt_obey
# 第21行
# Obey robots.txt rules
# ROBOTSTXT_OBEY = True
  • 設(shè)置User-Agent
# 第18行
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = "HuxiuSpider (+http://www.yourdomain.com)"
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
  • 設(shè)置訪問延遲
# 第29行
# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
DOWNLOAD_DELAY = 3

開啟pipline

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   "HuxiuSpider.pipelines.HuxiuspiderPipeline": 300,
}

開啟cookie(無需操作)(可選操作)

# Disable cookies (enabled by default)
#COOKIES_ENABLED = False

設(shè)置頻率(可不操作)

# The download delay setting will honor only one of:
# 定義了每個(gè)域名同時(shí)發(fā)送的請求數(shù)量
CONCURRENT_REQUESTS_PER_DOMAIN = 2
# 定義了每個(gè)IP同時(shí)發(fā)送的請求數(shù)量
#CONCURRENT_REQUESTS_PER_IP = 16

命令行快速生成模板:

scrapy genspider huxiu_article api-article.huxiu.com

Spider是用戶編寫用于從單個(gè)網(wǎng)站(或者一些網(wǎng)站)爬取數(shù)據(jù)的類。
其包含了一個(gè)用于下載的初始URL,如何跟進(jìn)網(wǎng)頁中的鏈接以及如何分析頁面中的內(nèi)容, 提取生成 item 的方法。
為了創(chuàng)建一個(gè)Spider,您必須繼承 scrapy.Spider 類, 且定義以下三個(gè)屬性:

  • name: 用于區(qū)別Spider。 該名字必須是唯一的,您不可以為不同的Spider設(shè)定相同的名字。
  • start_urls: 包含了Spider在啟動時(shí)進(jìn)行爬取的url列表。 因此,第一個(gè)被獲取到的頁面將是其中之一。 后續(xù)的URL則從初始的URL獲取到的數(shù)據(jù)中提取。(也可以刪除此變量,但要重寫start_requests方法)
  • parse() 是spider的一個(gè)方法。 被調(diào)用時(shí),每個(gè)初始URL完成下載后生成的 Response 對象將會作為唯一的參數(shù)傳遞給該函數(shù)。 該方法負(fù)責(zé)解析返回的數(shù)據(jù)(response data),提取數(shù)據(jù)(生成item)以及生成需要進(jìn)一步處理的URL的 Request 對象。

以下為我們的第一個(gè)Spider代碼,保存在 HuxiuSpider/spiders 目錄下的 huxiu_article.py 文件中:
我們對于此段代碼進(jìn)行必要的解釋:
向一個(gè)url發(fā)送post請求,發(fā)送一個(gè)時(shí)間戳,可以獲取這個(gè)時(shí)間戳以后的新聞推送,然后就是推送數(shù)據(jù),關(guān)于數(shù)據(jù)提取等操作可以點(diǎn)開鏈接頁自行觀察,太過簡單。

爬蟲程序模板:

新聞列表頁爬蟲

import json
import time

import scrapy

from HuxiuSpider.items import HuxiuspiderItem


class HuxiuArticleSpider(scrapy.Spider):
    def __init__(self):
        # 'https://www.huxiu.com/article/'
        self.url = 'https://api-article.huxiu.com/web/article/articleList'

    name = "huxiu_article"
    allowed_domains = ["api-article.huxiu.com"]

    def start_requests(self):
        timestamp = str(int(time.time()))
        form_data = {
            "platform": "www",
            "recommend_time": timestamp,
            "pagesize": "22"
        }
        yield scrapy.FormRequest(url=self.url, formdata=form_data, callback=self.parse)

    def parse(self, response):
        item = HuxiuspiderItem()
        res = response.json()
        success = res['success']
        print(res)
        if success:
            data = res['data']
            is_have_next_page = data['is_have_next_page']
            last_dateline = data['last_dateline']
            total_page = data['total_page']
            dataList = data['dataList']

            for data_obj in dataList:
                item['url'] = 'https://www.huxiu.com/article/' + data_obj['aid'] + '.html'
                item['title'] = data_obj['title']
                item['author'] = data_obj['user_info']['username']
                item['allinfo'] = json.dumps(data_obj, ensure_ascii=False)

                item['visited'] = False
                yield item

            if is_have_next_page:
                form_data = {
                    "platform": "www",
                    "recommend_time": str(last_dateline),
                    "pagesize": "22"
                }
                yield scrapy.FormRequest(url=self.url, formdata=form_data, callback=self.parse)
        else:
            raise Exception('請求新聞列表的時(shí)候失敗了~')

Item模板:

Item 是保存爬取到的數(shù)據(jù)的容器;其使用方法和python字典類似, 并且提供了額外保護(hù)機(jī)制來避免拼寫錯(cuò)誤導(dǎo)致的未定義字段錯(cuò)誤。
類似在ORM中做的一樣,您可以通過創(chuàng)建一個(gè) scrapy.Item 類, 并且定義類型為 scrapy.Field 的類屬性來定義一個(gè)Item。 (如果不了解ORM, 不用擔(dān)心,您會發(fā)現(xiàn)這個(gè)步驟非常簡單)(ORM其實(shí)就是使用類的方式與數(shù)據(jù)庫進(jìn)行交互)
首先根據(jù)需要從huxiu.com獲取到的數(shù)據(jù)對item進(jìn)行建模。 我們需要從dmoz中獲取名字,url,以及網(wǎng)站的描述。 對此,在item中定義相應(yīng)的字段。編輯 HuxiuSpider 目錄中的 items.py 文件:

import scrapy

class HuxiuspiderItem(scrapy.Item):
    url = scrapy.Field()
    title = scrapy.Field()
    author = scrapy.Field()
    # 存儲盡量多的信息是必要的,以應(yīng)對需求變更
    allinfo=scrapy.Field()

    visited=scrapy.Field()

一開始這看起來可能有點(diǎn)復(fù)雜,但是通過定義item, 您可以很方便的使用Scrapy的其他方法。而這些方法需要知道您的item的定義。

piplines模板:

from pymongo import MongoClient
from pymongo.errors import DuplicateKeyError

class HuxiuspiderPipeline:
    def __init__(self):
        self.client=MongoClient('localhost',
                      username='spiderdb',
                      password='password',
                      authSource='spiderdb',
                      authMechanism='SCRAM-SHA-1')
        self.db = self.client['spiderdb']
        self.collection = self.db['huxiu_links']

        self.collection.create_index("url", unique=True)

    def process_item(self, item, spider):
        item = dict(item)

        try:
            self.collection.insert_one(item)
        except DuplicateKeyError as e:
            pass

        return item

    def close_spider(self, spider):
        self.client.close()

運(yùn)行爬蟲

進(jìn)入項(xiàng)目的根目錄,執(zhí)行下列命令啟動spider:

scrapy crawl huxiu_article
# scrapy crawl huxiu_article -o dmoz.csv

完善項(xiàng)目-多層爬取

yield scrapy.Request(item['url'], meta={'item': item}, callback=self.detail_parse)

https://blog.csdn.net/ygc123189/article/details/79160146

注意事項(xiàng)

自定義spider起始方式

也可以是查詢數(shù)據(jù)庫的結(jié)果,但要注意數(shù)據(jù)統(tǒng)一性,因?yàn)閟crapy是異步爬取

自定義item類型與有無

spider爬取的結(jié)果封裝到item對象中,再提交給pipeline持久化,那么當(dāng)然也可以忽略item對象,傳遞你想要的數(shù)據(jù)格式直接到pipeline。

item與pipeline對應(yīng)關(guān)系

item的意思是數(shù)據(jù)實(shí)例,一個(gè)item提交后,會經(jīng)過所有的pipeline,pipeline的意思是管道,就是對數(shù)據(jù)的一系列操作,設(shè)置中的管道優(yōu)先級就是管道處理數(shù)據(jù)的順序,比如日志操作等。
如果要讓某一個(gè)pipeline只處理某些類型的item,可以在item進(jìn)入pipelne的時(shí)候判斷一下是否是你想要處理的item類型。示例如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-708961.html

class doubanPipeline(object):
    def process_item(self, item, spider):
        #判斷item是否為Item1類型
        if isinstance(item,doubanTextItem):
            # 操作item
        return item

scrapy是異步執(zhí)行的

同時(shí)運(yùn)行多個(gè)爬蟲

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

settings = get_project_settings()

crawler = CrawlerProcess(settings)

crawler.crawl('exercise')
crawler.crawl('ua')

crawler.start()
crawler.start()

post表單數(shù)據(jù)傳輸需要是字符串

自定義請求頭

import scrapy

class AddHeadersSpider(scrapy.Spider):
    name = 'add_headers'
    allowed_domains = ['sina.com']
    start_urls = ['https://www.sina.com.cn']
    headers = {
        'User-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.5,en;q=0.3",
        "Accept-Encoding": "gzip, deflate",
        'Content-Length': '0',
        "Connection": "keep-alive"
    }

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, headers=self.headers, callback=self.parse)
            
    def parse(self,response):
        print("---------------------------------------------------------")
        print("response headers: %s" % response.headers)
        print("request headers: %s" % response.request.headers)
        print("---------------------------------------------------------")

scrapy的FormRequest發(fā)送的是表單數(shù)據(jù)類型,如果要發(fā)送json類型需要使用Request

ts = round(time.time() * 1000)
form_data = {
    "nodeId": id_str,
    "excludeContIds": [],
    "pageSize": '20',
    "startTime": str(ts),
    "pageNum": '1'
}
yield scrapy.Request(url=self.url,method='POST',headers=self.headers,
                     body=json.dumps(form_data), callback=self.parse,
                     meta={'id_str': id_str})

到了這里,關(guān)于Scrapy簡介-快速開始-項(xiàng)目實(shí)戰(zhàn)-注意事項(xiàng)-踩坑之路的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 單體項(xiàng)目和多模塊項(xiàng)目jar包補(bǔ)丁部署注意事項(xiàng)

    單體項(xiàng)目和多模塊項(xiàng)目jar包補(bǔ)丁部署注意事項(xiàng)

    目前接觸的項(xiàng)目結(jié)構(gòu)主要有單體項(xiàng)目和多模塊項(xiàng)目,且這些項(xiàng)目是部署在網(wǎng)絡(luò)環(huán)境一般的服務(wù)器上,隨著項(xiàng)目規(guī)模變大,單個(gè)jar的體積動輒就上百M(fèi)B,每一次代碼小改動不可能都上傳整個(gè)jar,每次代碼改動后可能就是把編譯后的class文件在服務(wù)器上做一個(gè)替換,或者直接使用

    2024年01月21日
    瀏覽(18)
  • springboot項(xiàng)目創(chuàng)建整個(gè)完成過程和注意事項(xiàng)
  • RN_iOS項(xiàng)目編譯注意事項(xiàng)

    打包腳本(buildRNiOSBunble.sh) 1 編譯RN代碼 bjy_rnreactnative分支和bjy_ios原生分支放在同級目錄下,進(jìn)入bjy_rn目錄 更新最新rn代碼 編譯rn代碼 node_modules引入 yarn install 2 生成.jsbundle文件 react-native bundle --entry-file index.js --bundle-output …/bjy_ios/ w o r k s p a c e n a m e / {workspace_name}/ w or k s p a c

    2024年02月05日
    瀏覽(70)
  • Unity初學(xué)注意事項(xiàng),以及最新如何刪除云端項(xiàng)目

    Unity初學(xué)注意事項(xiàng),以及最新如何刪除云端項(xiàng)目

    作為一個(gè)對好玩的事感興趣的人 近段時(shí)間我開始學(xué)習(xí)Unity了 首先呢,我們得先了解Unity是用于開發(fā)游戲的一個(gè)開源軟件(當(dāng)然他的專業(yè)版還是要收費(fèi)的,這里指的個(gè)人版,初學(xué)者都是夠用的,個(gè)人版開發(fā)的游戲也可以發(fā)布,只要游戲所賺的金額不超過100000元都是可以不用換的

    2024年02月07日
    瀏覽(24)
  • CSGO搬磚項(xiàng)目全面講解 ,CSGO搬磚注意事項(xiàng)

    CSGO搬磚項(xiàng)目全面講解 ,CSGO搬磚注意事項(xiàng)

    Steam/CSGO游戲搬磚全套操作流程之如何選品(第二課) 一個(gè)游戲只要能搬,只要體量不夠大,很快就會貨幣價(jià)格暴跌,直接涼涼。市面上的能穩(wěn)定手動搬磚的游戲越來越少。所以對于兼職賺點(diǎn)外快的散人搬磚黨來說,找一個(gè)穩(wěn)定長期的老端游才是王道。 CSGO搬磚項(xiàng)目全面講解

    2024年02月05日
    瀏覽(21)
  • Linux bzip2命令教程:文件壓縮與解壓縮實(shí)戰(zhàn)(附案例詳解和注意事項(xiàng))

    bzip2 是一個(gè)基于命令行的文件壓縮器,它使用Burrows-Wheeler塊排序文本壓縮算法和哈夫曼編碼來進(jìn)行壓縮。它的主要功能是壓縮和解壓縮文件,將多個(gè)文件綁定成一個(gè)單一的文件,這樣可以減少原始文件所占用的存儲空間。 bzip2 命令在大多數(shù)Linux發(fā)行版中都可以使用,包括Deb

    2024年04月15日
    瀏覽(23)
  • java分布式項(xiàng)目需要進(jìn)行注意的事項(xiàng)(代碼層面)

    在分布式系統(tǒng)中,使用主鍵自增會引發(fā)一系列問題。以下是幾個(gè)主要原因: 高并發(fā)沖突:在分布式系統(tǒng)中,多個(gè)節(jié)點(diǎn)同時(shí)生成主鍵時(shí)會產(chǎn)生沖突。因?yàn)槊總€(gè)節(jié)點(diǎn)都有自己的自增序列,同時(shí)生成的主鍵可能會有重復(fù)。 單點(diǎn)故障:使用主鍵自增通常依賴于一個(gè)中心節(jié)點(diǎn)或數(shù)據(jù)庫

    2024年04月22日
    瀏覽(24)
  • 如何使用Vscode開發(fā)Uni-app項(xiàng)目以及注意事項(xiàng)詳解

    如何使用Vscode開發(fā)Uni-app項(xiàng)目以及注意事項(xiàng)詳解

    喲,大牛來了?。。?前言 :想必大家敲代碼用的編輯器大多數(shù)都是Vscode吧,隨著技術(shù)的更新,uni-app成為了前端不可或缺的一項(xiàng)技術(shù),但是呢,官方推薦使用的HBuilderX編輯器讓習(xí)慣了使用Vscode的我們不太習(xí)慣,雖然HBuilderX編輯器對uni-app極度的友好,但還是讓在座的各位大牛以及

    2024年02月05日
    瀏覽(25)
  • Go新項(xiàng)目-Golang使用RemoteAddr()獲取遠(yuǎn)程主機(jī)地址的注意事項(xiàng)(9)

    Go新項(xiàng)目-Golang使用RemoteAddr()獲取遠(yuǎn)程主機(jī)地址的注意事項(xiàng)(9)

    http.Request 下的方法RemoteAddr() 可以獲取客戶端的地址和端口號,最近的一個(gè)項(xiàng)目中用到了這個(gè)方法。 使用過程中一直都沒有什么問題,但是當(dāng)項(xiàng)目上線之后就發(fā)現(xiàn)不管怎么獲取ip,客戶端地址都是127.0.0.1 。 對于這個(gè)問題一直百思不得其解,最后搞了半天才發(fā)現(xiàn)是nginx 的原因。

    2024年01月20日
    瀏覽(21)
  • 【SQL開發(fā)實(shí)戰(zhàn)技巧】系列(三十五):數(shù)倉報(bào)表場景?根據(jù)條件返回不同列的數(shù)據(jù)以及Left /Full Join注意事項(xiàng)

    【SQL開發(fā)實(shí)戰(zhàn)技巧】系列(一):關(guān)于SQL不得不說的那些事 【SQL開發(fā)實(shí)戰(zhàn)技巧】系列(二):簡單單表查詢 【SQL開發(fā)實(shí)戰(zhàn)技巧】系列(三):SQL排序的那些事 【SQL開發(fā)實(shí)戰(zhàn)技巧】系列(四):從執(zhí)行計(jì)劃討論UNION ALL與空字符串UNION與OR的使用注意事項(xiàng) 【SQL開發(fā)實(shí)戰(zhàn)技巧】系列

    2023年04月12日
    瀏覽(38)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包