一谋国、安裝scrapy
首先安裝依賴庫Twisted
pip install (依賴庫的路徑)
在這個網(wǎng)址http://www.lfd.uci.edu/~gohlke/pythonlibs#twisted 下面去尋找符合你的python版本和系統(tǒng)版本的Twisted
然后在安裝scrapy框架
pip install scrapy
【注意】路徑名不能有中文,不能用管理員進入cmd迁沫,電腦系統(tǒng)用戶路徑不能是中文
二芦瘾、框架簡介
該框架是一個第三方的框架捌蚊,許多功能已經(jīng)被封裝好(比如:下載功能)
流程原理圖
由五部分構(gòu)成:
引擎、下載器近弟、爬蟲缅糟、調(diào)度器、管道(item和pipeline)
以上五部分我們只需要關(guān)系其中的兩部分:爬蟲和管道
spiders:蜘蛛或爬蟲祷愉,我們分析網(wǎng)頁的地方窗宦,我們主要的代碼寫在這里
管道:包括item和pipeline,用于處理數(shù)據(jù)
引擎:用來處理整個系統(tǒng)的數(shù)據(jù)流二鳄,觸發(fā)各種事務(wù)(框架的核心)
下載器:用于下載網(wǎng)頁內(nèi)容赴涵,并且返回給蜘蛛(下載器基于Twisted的高效異步模型)
調(diào)度器:用來接收引擎發(fā)過來的請求,壓入隊列中等處理任務(wù)
三泥从、使用
- 創(chuàng)建項目指令
scrapy startproject 項目名
- 項目目錄結(jié)構(gòu)
firstSpider 項目名稱
firstSpider
spiders 爬蟲目錄(寫代碼位置)
__init__.py
myspider.py 爬蟲文件,以后的爬蟲代碼寫在這里
__init__.py
items.py 定義數(shù)據(jù)結(jié)構(gòu)地方
middlewares.py 中間件(了解)
pipelines.py 管道文件
settings.py 項目配置文件
scrapy.cfg
- 創(chuàng)建爬蟲指令
scrapy genspider 爬蟲名 域名
- 運行爬蟲指令
scrapy crawl 爬蟲名
scrapy crawl 爬蟲名 -o xxx.csv\json\xml
四、執(zhí)行流程
1輸入scrapy crawl '項目名稱'
2讀取setting.py配置信息
3執(zhí)行spiders目錄下的爬蟲程序沪摄,執(zhí)行_init_()方法和parse()方法
4在parse方法里解析html躯嫉,返回一個item實4按照配置順序執(zhí)行pipelines.py(可多個)執(zhí)行邏輯,一般是存儲杨拐。
5程序結(jié)束祈餐。
五、管道包含 items and pipline
- 作用
1哄陶、清理HTML數(shù)據(jù)帆阳。
2、驗證爬取數(shù)據(jù)屋吨,檢查爬取字段蜒谤。
3、查重并丟棄重復(fù)內(nèi)容至扰。
4鳍徽、將爬取結(jié)果保存到數(shù)據(jù)庫。
- 幾個核心的方法
創(chuàng)建一個項目的時候都會自帶pipeline其中就實現(xiàn)了process_item(item, spider)方法
1敢课、open_spider(spider)就是打開spider時候調(diào)用的,常用于初始化操作(常見開啟數(shù)據(jù)庫連接,打開文件)
2阶祭、close_spider(spider)關(guān)閉spider時候調(diào)用,常用于關(guān)閉數(shù)據(jù)庫連接
3、from_crawler(cls, crawler)是一個類方法(需要使用@classmethod裝飾器標識),一般用來從settings.py中獲取常量的
4直秆、process_item(item, spider)是必須實現(xiàn)的,別的都是選用的濒募!
- 參數(shù)
item是要處理的item對象
spider當前要處理的spider對象
- 返回值
返回item就會繼續(xù)給優(yōu)先級低的item pipeline二次處理
如果直接拋出DropItem的異常就直接丟棄該item
- piplines.py
進行數(shù)據(jù)存儲
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
import csv
import pymysql
# 寫入csv表格
class InterestingPipeline(object):
# 開啟爬蟲
def open_spider(self,spider):
self.csv_file = open("u148.csv",'w',encoding='utf-8')
# 創(chuàng)建一個列表用于整合csv數(shù)據(jù)
self.csv_items = []
def process_item(self, item, spider):
# 整合csv數(shù)據(jù)
# 把item字典轉(zhuǎn)化成列表
csv_item =[]
csv_item.append(item['title'])
csv_item.append(item['author'])
csv_item.append(item['intro'])
csv_item.append(item['img'])
csv_item.append(item['type'])
csv_item.append(item['date'])
self.csv_items.append(csv_item)
# 【注意】這里每遍歷一個item以后一定要把他返回出去,如果不返回圾结,其它優(yōu)先級比這個管道低的就無法獲取到其它item
return item
def close_spider(self,spider):
# 把前面整合完成的數(shù)據(jù)寫入csv文件
writer = csv.writer(self.csv_file)
# 寫表頭
writer.writerow(['title','author','intro','img','type','date'])
# 寫內(nèi)容
writer.writerows(self.csv_items)
self.csv_file.close()
# 定義一個管道類瑰剃,用于寫入數(shù)據(jù)庫
class MysqlPipeline(object):
def open_spider(self,spider):
self.db =pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123456',db='u148',charset='utf8')
self.cursor =self.db.cursor()
# self.db.begin()
def process_item(self,item,spider):
# 定義sql語句
sql = "INSERT INTO music VALUES(NULL,'%s','%s','%s','%s','%s','%s')"%(item['title'],item['author'],item['img'],item['intro'],item['type'],item['date'])
self.cursor.execute(sql)
self.db.commit()
return item
def close_spider(self,spider):
self.cursor.close()
self.db.close()
- items.py
import scrapy
# 主要是對待爬取的數(shù)據(jù)進行模型化,并且對接需求分析
class InterestingItem(scrapy.Item):
# 本質(zhì)是一個字典對象筝野,
# define the fields for your item here like:
# name = scrapy.Field()
# 網(wǎng)頁里面需要爬取那些內(nèi)容
# title
title = scrapy.Field()
# 圖片
img = scrapy.Field()
# 簡介
intro = scrapy.Field()
# 作者
author = scrapy.Field()
# 類型
type = scrapy.Field()
# 日期
date = scrapy.Field()
五培他、settings配置
- 代理設(shè)置
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
- 是否遵循robots協(xié)議
ROBOTSTXT_OBEY = False
- 下載延時
# 單位:秒
DOWNLOAD_DELAY = 2
- 默認請求頭
DEFAULT_REQUEST_HEADERS = {
'Accept': '*/*',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Content-Type': 'application/x-www-form-urlencoded',
'Connection': 'keep-alive',
# 'Host': 'passport.weibo.cn',
'Origin': 'https://passport.weibo.cn',
'Referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&r=https%3A%2F%2Fweibo.cn%2F%3Fluicode%3D20000174&backTitle=%CE%A2%B2%A9&vt='
}
- 開啟管道
ITEM_PIPELINES = {
#300表示優(yōu)先級鹃两,范圍(0-1000),越小級別越高
'Weibo.pipelines.WeiboPipeline': 300,
}