Scrapy 基礎-01

来源:https://www.cnblogs.com/sunjingjingking/archive/2018/12/24/10171135.html
-Advertisement-
Play Games

Scrapy Scrapy 是一個位了爬取網站數據,提取數據結構性數據而編寫的應用框架,少量代碼,就能快速爬取,使用了Twisted 非同步網路框架,加快我們下載速度! 工作流程 製作 Scrapy 爬蟲 一共需要4步: 新建項目 (scrapy startproject xxx):新建一個新的爬蟲項 ...


Scrapy

Scrapy 是一個位了爬取網站數據,提取數據結構性數據而編寫的應用框架,少量代碼,就能快速爬取,使用了Twisted 非同步網路框架,加快我們下載速度!

Image

 

Image

工作流程

製作 Scrapy 爬蟲 一共需要4步:

    新建項目 (scrapy startproject xxx):新建一個新的爬蟲項目    明確目標 (編寫items.py):明確你想要抓取的目標    製作爬蟲 (spiders/xxspider.py):製作爬蟲開始爬取網頁    存儲內容 (pipelines.py):設計管道存儲爬取內容       Scrapy Engine(引擎): 負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數據傳遞等。   Scheduler(調度器): 它負責接受引擎發送過來的Request請求,並按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎。   Downloader(下載器):負責下載Scrapy Engine(引擎)發送的所有Requests請求,並將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理,   Spider(爬蟲):它負責處理所有Responses,從中分析提取數據,獲取Item欄位需要的數據,並將需要跟進的URL提交給引擎,再次進入Scheduler(調度器).   Item Pipeline(管道):它負責處理Spider中獲取到的Item,併進行進行後期處理(詳細分析、過濾、存儲等)的地方。   Downloader Middlewares(下載中間件):你可以當作是一個可以自定義擴展下載功能的組件。   Spider Middlewares(Spider中間件):你可以理解為是一個可以自定擴展和操作引擎和Spider中間通信的功能組件(比如進入Spider的Responses;和從Spider出去的Requests)

Scrapy的運作流程

代碼寫好,程式開始運行...    1 引擎:Hi!Spider, 你要處理哪一個網站?   2 Spider:老大要我處理xxxx.com   3 引擎:你把第一個需要處理的URL給我吧。   4 Spider:給你,第一個URL是xxxxxxx.com   5 引擎:Hi!調度器,我這有request請求你幫我排序入隊一下。   6 調度器:好的,正在處理你等一下。   7 引擎:Hi!調度器,把你處理好的request請求給我。   8 調度器:給你,這是我處理好的request   9 引擎:Hi!下載器,你按照老大的下載中間件的設置幫我下載一下這個request請求   10 下載器:好的!給你,這是下載好的東西。(如果失敗:sorry,這個request下載失敗了。然後引擎告訴調度器,這個request下載失敗了,你 記錄一下,我們待會兒再下載)   11 引擎:Hi!Spider,這是下載好的東西,並且已經按照老大的下載中間件處理過了,你自己處理一下(註意!這兒responses預設是交給def parse()這個函數處理的)   12 Spider:(處理完畢數據之後對於需要跟進的URL),Hi!引擎,我這裡有兩個結果,這個是我需要跟進的URL,還有這個是我獲取到的Item數據。   13 引擎:Hi !管道 我這兒有個item你幫我處理一下!調度器!這是需要跟進URL你幫我處理下。然後從第四步開始迴圈,直到獲取完老大需要全部信息。   14 管道調度器:好的,現在就做! 註意!只有當調度器中不存在任何request了,整個程式才會停止,(也就是說,對於下載失敗的URL,Scrapy也會重新下載。)  

入門實例爬取(騰訊招聘)

準備環境:

1)創建項目 pip install scrapy scrapy startproject myspider   2)創建儀個爬蟲 scrapy genspider itcast(爬蟲名字)  "itcast.cn"(限制網站的範圍)   3)啟動爬蟲 scrapy crawl itcast  

代碼:

 1 ###設置item 欄位###
 2 import scrapy
 3 
 4 class MyspiderItem(scrapy.Item):
 5     title = scrapy.Field()
 6     position = scrapy.Field()
 7     time = scrapy.Field()
 8     address = scrapy.Field()
 9 
10 ###設置spiders 目錄下的爬蟲腳本,可以設置多個##
11 vim spiders/itcast.py
12 # -*- coding: utf-8 -
13 import scrapy
14 import sys
15 #之前設置好的items 導入進來
16 from myspider.items import MyspiderItem
17 
18 class ItcastSpider(scrapy.Spider):
19     #spider.name 可以用於判斷
20     name = 'itcast'
21     #限制範圍
22     allowed_domains = ['tencent.com']
23     start_urls = ['https://hr.tencent.com/position.php?lid=2218&tid=87']
24     #parse方法不能修改,必須有
25     def parse(self, response):
26         tb_list = response.xpath("//table[@class='tablelist']/tr")[1:-1]
27         for tr in tb_list:
28              #字典對象
29             item = MyspiderItem()
30             item['title'] = tr.xpath("./td[1]/a/text()").extract_first()
31             item['position'] = tr.xpath("./td[2]/text()").extract_first()
32             item['address'] = tr.xpath("./td[4]/text()").extract_first()
33             item['time'] = tr.xpath("./td[5]/text()").extract_first()
34             yield item
35         #翻頁
36         next_url = response.xpath("//a[@id='next']/@href").extract_first()
37         print(next_url)
38         if next_url != "javascript:;":
39             next_url = "https://hr.tencent.com/" +next_url
40             print(next_url)
41             #下一頁請求,scrapy封裝好的request請求
42             yield scrapy.Request(
43                 next_url,
44                 callback=self.parse
45               )
46             print("="*30)
47 
48 ##設置存儲pipeline##
49 vim pipelines.py
50 # -*- coding: utf-8 -*-
51 import json
52 class MyspiderPipeline(object):
53     def process_item(self,item,spider):
54         #有判斷,以後可以寫多個piiline,來存儲
55         if spider.name == "itcast":
56            with open('temp.txt','a') as f:
57               #item 是一個對象,要轉成字典!
58               json.dump(dict(item),f,ensure_ascii=False,indent=2)
59 
60 
61 ##設置setting 配置##
62 開啟pipelines,可以設置多個
63 
64 ITEM_PIPELINES = {
65     'myspider.pipelines.MyspiderPipeline': 300,
66     'myspider.pipelines.XXXXPipeline': 300,
67 }
68 #不顯示日誌
69 LOG_LEVEL = "WARNING"
70 
71 ##瀏覽器頭
72 USER_AGENT = 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1'

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spring-data-jpa中非常簡單的查詢介面方式與CUBA相結合,簡化CUBA開發人員操作數據的方法,能有效提升代碼質量和交付速度 ...
  • 背景 首先,我們達成以下共識: 一個服務方法,如果入參太多,且基本為非pojo,會給調用方造成不必要的干擾。儘管可以把文檔寫的很完善,但還是建議使用pojo對多個參數合理封裝。 如下示例: 執行方法都應該對入參進行校驗。對於一些 通用的簡單的不涉及業務邏輯 的校驗,比如字元串不為空,數字的範圍限制, ...
  • Java線程通信方法 0、(why)每個線程都有自己的棧空間,我們要線程之間進行交流,合作共贏。 1、synchronized和volatile關鍵字 a) 看下麵的synchronized關鍵字 b) 看下麵的volatile關鍵字 2、等待/通知機制:一個線程A調用對象的wait()方法,另一個 ...
  • 一.遞歸函數的弊端 遞歸函數雖然編寫時用很少的代碼完成了龐大的功能,但是它的弊端確實非常明顯的,那就是時間與空間的消耗。 用一個斐波那契數列來舉例 import time #@lru_cache(20) def fibonacci(n): if n < 2: return 1 else: retur ...
  • 前言 本篇緊接著spring入門詳細教程(一),建議閱讀本篇前,先閱讀第一篇。鏈接如下: Spring入門詳細教程(一) https://www.cnblogs.com/jichi/p/10165538.html 一、spring註入方式 1、set方法註入 2、構造方法註入 3、p名稱空間註入 4 ...
  • JUnit常用單元測試註解介紹及代碼演示 by:授客 QQ:1033553122 1. 測試環境 1 2. 基礎概念 1 3. 常用Annotation 1 4. 運行環境配置 3 maven配置 3 Eclipse maven運行環境配置 4 更新項目 5 5. 單元測試實踐 7 被測類Binar ...
  • 1. 安裝 2. 項目目錄 3. settings配置 4. celery模塊 python 在task文件中 from __future__ import absolute_import, unicode_literals import os from celery import Celery s ...
  • 一、BOM對象 1,window對象 所有瀏覽器都支持window對象,從概念上講:一個HTML文檔對應一個window對象,從功能上講:控制瀏覽器視窗的,從使用上講:window對象不需要創建對象,直接使用即可 2,window對象方法 3,方法的使用 3.1彈窗方法,警告窗alert、確認窗co ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...