文章目錄
一、win10安裝Scrapy
(1)有兩種辦法,一是用Anaconda安裝,進入命令行,輸入
conda install scrapy
爲什麼會這麼簡單呢?因爲Anaconda已經安裝好Scrapy 所需要的依賴庫了。
等待安裝進度完成後,界面如下:
(2)二是用pip安裝,pip無法直接安裝scrapy框架,需要先安裝很多依賴庫,自行。
二、檢測是否安裝成功
三、Scrapy框架介紹
製作Scrapy爬蟲只需4步:
(1)新建項目
(2)新建爬蟲:
(2-1)編寫 Items.py:明確你要抓取的目標
(2-2)製作爬蟲.py:編寫爬蟲文件
(2-3)存儲內容 pipelines.py:設計管道存儲爬取內容
註明出處:Scrapy框架基礎 講解及教程 - https://blog.csdn.net/qq_41500222/article/details/82850582
四、編寫第一個爬蟲
1、創建一個工程
按住shift-右鍵-在此處打開命令窗口,輸入scrapy startproject +工程名
創建成功,打開文件夾目錄如下:
.
├── 工程名
│ ├── __init__.py
│ ├── items.py
│ ├── middlewares.py
│ ├── pipelines.py
│ ├── settings.py
│ └── spiders
└── scrapy.cfg
解釋文件:
spiders:放置 spider 代碼的目錄文件 spiders(用於編寫爬蟲)
items.py:用於保存所抓取的數據的容器,其存儲方式類似於 Python 的字典
middlewares.py:下載中間件,提供一種簡便的機制,當做一個自定義擴展下載功能的組件。
pipelines.py:核心處理器,定義Item Pipeline的實現,實現數據的清洗,儲存,驗證。
settings.py:設置文件
scrapy.cfg:配置文件
自主設置:
2、定義Item
item是保存爬取數據的容器,類似字典。首先根據需要從quotes.toscrape獲取到的數據對item進行建模:
編輯 tutorial 目錄中的 items.py 文件,在item中定義我們想要抓取的字段,如下
import scrapyclass QuoteItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
text = scrapy.Field()
author = scrapy.Field()
tags = scrapy.Field()
pass
3、編寫爬取網站的spider並提取Item
(1)編寫spider
命令窗口中,在 tutorial/spiders 目錄下,輸入命令:scrapy genspider + 爬蟲名 + 爬蟲域名 )
這樣創建的文件包含最基本的代碼,打開:
# -*- coding: utf-8 -*-
import scrapy
class QuotesSpider(scrapy.Spider):
name = 'quotes' #spider的名字
allowed_domains = ['quotes.toscrape.com'] #允許爬取的域名
start_urls = ['http://quotes.toscrape.com/'] #spider爬取的網站,定義初始的請求url,可以多個
def parse(self, response):
pass
#parse方法:是spider的一個方法,在請求start_url之後的方法,這個方法是對網頁的解析和提取想要的東西
#response參數:請求網頁後返回的內容,即你需要解析的網頁
完善代碼:
# -*- coding: utf-8 -*-
import scrapy
from tutorial.items import QuoteItem
class QuotesSpider(scrapy.Spider):# spider的名字,該名字必須是唯一的,您不可以爲不同的Spider設定相同的名字。
name = "quotes"
allowed_domains = ["quotes.toscrape.com"] # 包含了Spider在啓動時進行爬取的url列表。 因此,第一個被獲取到的頁面將是其中之一。 後續的URL則從初始的URL獲取到的數據中提取。
start_urls = ['http://quotes.toscrape.com/'] # parse() 是spider的一個方法。 被調用時,每個初始URL完成下載後生成的 Response 對象將會作爲唯一的參數傳遞給該函數。 該方法負責解析返回的數據(response data),提取數據(生成item)以及生成需要進一步處理的URL的 Request 對象。
def parse(self, response):
for quote in response.css('.quote'):
item = QuoteItem()
item['text']= quote.css('.text::text').extract_first()
item['author'] = quote.css('.author::text').extract_first()
item['tags'] = quote.css('.tags .tag::text').extract_first()
yield item
4、編寫Item Pipeline來存儲提取到的Item(即數據)
這裏直接使用Scrapy自帶的Pipline保存數據。
5、執行:進入根目錄
scrapy runspiderr quotes.py -o quotes.json
或者 scrapy crawl 爬蟲名 -o 結果文件
scrapy crawl quotes -o quotes.json
——————————————————————————————
參考:
爬蟲框架Scrapy的安裝與基本使用 - https://www.jianshu.com/p/6bc5a4641629
scrapy框架入門教程 - https://www.jianshu.com/p/d500ecaf7994
Scrapy基礎 - 簡書 - https://www.jianshu.com/p/5c7e3e2d4a33
——————————————————————————————
6、遇到的一些問題:
在爬蟲文件調用Items時,注意路徑設置:
(1-1)在目錄上右鍵,選擇Mark Directory As Sources root,把你的項目目錄添加到sources root
(1-2)在設置->項目->構建,執行,部署->console,勾選Add source roots to PYTHONPATH。
——————————————————————————————
運行,選對路徑!對象是你創建並命名的那個爬蟲文件!
出現問題:
原因是 當前路徑錯誤,或者路徑正確 確實丟失了scrapy.cfg文件(放上即可)。
運行爬蟲文件Error:找不到Item文件
是相對路徑問題,解決辦法:
7、待續:將數據存儲入數據庫
總結
1、三個基本命令
2、應對反爬蟲的基本策略
1、用戶代理
def start_requests(self):
for url in self.start_urls:
headers = random.choice(headers_pool) # 隨機選一個headers
proxy_addr = random.choice(proxy_pool) # 隨機選一個代理
yield scrapy.Request(url, callback=self.parse, headers=headers})
2、IP代理
def start_requests(self):
for url in self.start_urls:
proxy_addr = random.choice(proxy_pool) # 隨機選一個
yield scrapy.Request(url, callback=self.parse, meta={'proxy': proxy_addr}) # 通過meta參數添加代理
proxy_addr字符串格式是’Scheme://IP:Port’
分辨靜態頁面與動態頁面
所謂靜態頁面就是說頁面文件中沒有程序,只有HTML代碼,通常以.html或.htm爲後綴名的頁面,靜態網站內容不會在製造完成後發生變化,任何人訪問都顯現一樣的內容,若你需要對內容進行更新就必須修正原代碼後再上傳到服務器上.
與靜態網頁相比動態網頁所具備的特點就是:
1.網頁文件不僅具有HTML標記,而且含有程序代碼;
2.用數據庫連接;
3.動態網頁能根據不同的時間,不同的來訪者顯示不同的內容;
4.動態網站更新方便,在後臺可直接更新.
參考: