Scrapy框架簡介
Scrapy架構圖
一、新建專案
scrapy startproject myspider
建立爬蟲專案
scrapy startproject jobboleproject
新建爬蟲檔案
scrapy genspider jobbole jobbole.com
二、明確目標:
- 在items.py中新增欄位
根據目標網站分析需要提取的資料,在item.py檔案中新增欄位
開啟jobboleproject檔案下的item.py檔案
可以通過建立一個 scrapy.Item 類, 並且定義型別為 scrapy.Field的類屬性來定義一個Item(可以理解成類似於ORM的對映關係)。
接下來,建立一個JobboleprojectItem 類,和構建item模型(model)。 - 製作爬蟲
開啟 jobboleproject/spider目錄裡的 [jobbole.py]編寫程式碼
import scrapy
class JobboleSpider(scrapy.Spider):
name = 'jobbole'
allowed_domains = ['jobbole.com']
start_urls = ['http://blog.jobbole.com/all-posts/']
def parse(self, response):
pass
- name = "" :這個爬蟲的識別名稱,必須是唯一的,在不同的爬蟲必須定義不同的名字。
- allow_domains = [] 是搜尋的域名範圍,也就是爬蟲的約束區域,規定爬蟲只爬取這個域名下的網頁,不存在的URL會被忽略。
- start_urls = () :爬取的URL元祖/列表。爬蟲從這裡開始抓取資料,所以,第一次下載的資料將會從這些urls開始。其他子URL將會從這些起始URL中繼承性生成。
- parse(self, response) :解析的方法,每個初始URL完成下載後將被呼叫,呼叫的時候傳入從每一個URL傳回的Response物件來作為唯一引數,主要作用如下:
負責解析返回的網頁資料(response.body),提取結構化資料(生成item)
生成需要下一頁的URL請求。
- 分析網站結構取資料,在parse方法中做資料的提取
from jobboleproject.items import JobboleprojectItem
1.獲取圖片和文章詳情的連結
def parse(self, response):
# css選擇器獲取當前列表頁面的所有的節點
post_nodes = response.css("#archive .floated-thumb .post-thumb a")
# 如果不是完整的域名 需要拼接完整 response.url + post_url
# 獲取到的URL可能不是一個域名,也可能是具體的文章需要使用parse函式from urllib import parse
for post_node in post_nodes:
image_url = post_node.css("img::attr(src)").extract_first("")
post_url = post_node.css("::attr(href)").extract_first("")
full_url = response.urljoin(post_url)
#meta引數對應的是一個字典,用來傳遞資料
yield scrapy.Request(url=full_url, meta={"front_image_url": image_url},
callback=self.parse_detail)
yield
的作用就是把一個函式變成一個 generator(生成器),帶有 yield 的函式不再是一個普通函式,Python 直譯器會將其視為一個 generator,帶有yeild的函式遇到yeild的時候就返回一個迭代值,下次迭代時, 程式碼從 yield 的下一條語句繼續執行,而函式的本地變數看起來和上次中斷執行前是完全一樣的,於是函式繼續執行, 直到再次遇到 yield。
通俗的講就是:在一個函式中,程式執行到yield語句的時候,程式暫停,返回yield後面表示式的值,在下一次呼叫的時候,從yield語句暫停的地方繼續執行,如此迴圈,直到函式執行完。
Scrapy Item pipeline(管道檔案)使用
編寫item pipeline,item pipiline元件是一個獨立的Python類,其中process_item()方法必須實現:
import something
class SomethingPipeline(object):
def __init__(self):
# 可選實現,做引數初始化等
# doing something
def process_item(self, item, spider):
# item (Item 物件) – 被爬取的item
# spider (Spider 物件) – 爬取該item的spider
# 這個方法必須實現,每個item pipeline元件都需要呼叫該方法,
# 這個方法必須返回一個 Item 物件,被丟棄的item將不會被之後的pipeline元件所處理。
return item
def open_spider(self, spider):
# spider (Spider 物件) – 被開啟的spider
# 可選實現,當spider被開啟時,這個方法被呼叫。
def close_spider(self, spider):
# spider (Spider 物件) – 被關閉的spider
# 可選實現,當spider被關閉時,這個方法被呼叫
啟用一個Item Pipeline元件 為了啟用Item Pipeline元件,必須將它的類新增到 settings.py檔案ITEM_PIPELINES 配置,(0-1000隨意設定,數值越低,元件的優先順序越高
定製圖片下載管道
Scrapy提供了一個 item pipeline ,來下載屬於某個特定專案的圖片,這條管道,被稱作圖片管道,在 ImagesPipeline 類中實現,提供了一個方便並具有額外特性的方法,來下載並本地儲存圖片:
Pillow 是用來生成縮圖,並將圖片歸一化為JPEG/RGB格式,因此為了使用圖片管道,你需要安裝這個庫。
使用圖片管道 當使用 ImagesPipeline ,典型的工作流程如下所示:
在settings.py中設定 IMAGES_STORE 設定為一個有效的資料夾,用來儲存下載的圖片
IMAGES_STORE = '/xxx/xxx/xxx'
from scrapy.contrib.pipeline.images import ImagesPipeline
import scrapy
from scrapy.exceptions import DropItem
import os
from scrapy.utils.project import get_project_settings
#下載圖片
image_store = get_project_settings().get('IMAGES_STORE')
class jobboleImagePipline(ImagesPipeline):
def get_media_requests(self, item, info):
#根據圖片地址,構建請求
yield scrapy.Request(item['coverImage'])
def item_completed(self, results, item, info):
print(results)
#獲取圖片下載成功的請求路徑
image_paths = [x['path'] for ok, x in results if ok]
#判斷圖片是否下載成功
if not image_paths:
#出現錯誤,例如沒有圖片,可以丟棄item
raise DropItem("Item contains no images")
else:
#替換圖片的名稱,自定義圖片名稱
os.rename(image_store+'/'+image_paths[0],
image_store+'/'+item['title']+'.jpg')
#將圖片地址賦值給item
item['localImagePath'] = image_store+'/'+item['title']+'.jpg'
return item
爬蟲資料持久化儲存
settings.py檔案: 設定檔案,在這裡設定User-Agent,啟用管道檔案等...
ITEM_PIPELINES = {
'douban.pipelines.DoubanPipeline': 300,
}
MONGODB 主機名
MONGODB_HOST = '127.0.0.1'
MONGODB 埠號
MONGODB_PORT= 27017
資料庫名稱
MONGODB_DBNAME = "Douban"
儲存資料的表名稱
MONGODB_SHEETNAME= "doubanmovies"
MongDB插入資料
import pymongo
# from scrapy.utils.project import
class ChinazprojectPipeline(object):
def __init__(self,host,port,dbname):
#建立mongdb資料庫連線
self.mongo_client = pymongo.MongoClient(
host=host,port=port
)
#選擇要操作的資料庫
self.db = self.mongo_client[dbname]
@classmethod
def from_crawler(cls,crawler):
host = crawler.settings['MONGO_HOST']
prot = crawler.settings['MONGO_PORT']
db = crawler.settings['MONGO_DB']
return cls(host,prot,db)
def process_item(self, item, spider):
"""
這個方法是必須實現的,爬蟲檔案中所有的item都會經過這個方法
:param item: 爬蟲檔案傳遞過來的item物件
:param spider: 爬蟲檔案例項化的物件
:return:
"""
#選擇要操作的集合
col_name = item.get_mongdb_collectionName()
col = self.db[col_name]
#插資料
dict_data = dict(item)
try:
col.insert(dict_data)
print('資料插入成功')
except Exception as err:
print('資料插入失敗',err)
return item
def open_spider(self,spider):
print(spider.name,'爬蟲開始')
def close_spider(self,spider):
self.mongo_client.close()
print(spider.name,'爬蟲結束')
Mysql資料庫插入資料
settings.py檔案: 設定檔案,在這裡設定User-Agent,啟用管道檔案等...
ITEM_PIPELINES = {
'douban.pipelines.DoubanPipeline': 300,
}
#關於資料庫的相關配置
MYSQL_HOST = '127.0.0.1'
MYSQL_PORT = 3306
MYSQL_USER = ''
MYSQL_PWD = ''
MYSQL_DB = ''
class ChinazprojectPipeline(object):
def __init__(self):
"""
初始化方法
"""
# self.file = open('chinaz.json','a')
# 建立資料庫連結
self.client = pymysql.Connect(
'127.0.0.1', 'root', '1234', 'chinaz', 3306, charset='utf8'
)
# 建立遊標
self.cursor = self.client.cursor()
def open_spider(self, spider):
"""
爬蟲啟動的時候會呼叫一次
:param spider:
:return:
"""
print('爬蟲開啟了')
def process_item(self, item, spider):
"""
這個方法是必須實現的,爬蟲檔案中所有的item都會經過這個方法
:param item: 爬蟲檔案傳遞過來的item物件
:param spider: 爬蟲檔案例項化的物件
:return:
"""
# 儲存到本地json檔案
# import json
# json_data = json.dumps(data_dict,ensure_ascii=False)
# self.file.write(json_data+'\n')
# if isinstance(item,ChinaprojectWebInfoItem):
# print('網站資訊')
# tablename = 'webinfo'
# elif isinstance(item,ChinazprojectTagItem):
# print('網站分類資訊')
# tablename = 'tag'
data_dict = dict(item)
sql,data = item.get_insert_sql_data(data_dict)
try:
# self.cursor.execute(sql, list(data_dict.values()))
# self.client.commit()
self.cursor.execute(sql,data)
self.client.commit()
except Exception as err:
self.client.rollback()
print(err)
# 如果有多個管道檔案,一定要注意return item,否則下個管道無法接收
print('經過了管道')
return item
def close_spider(self, spider):
"""
爬蟲結束的時候會呼叫一次
:param spider:
:return:
"""
# self.file.close()
self.cursor.close()
self.client.close()
print('爬蟲結束')
實現Mysql非同步插入(資料量非常大時,採用非同步插入)
from twisted.enterprise import adbapi
class ChinazprojectPipeline(object):
def __init__(self,dbpool):
self.dbpool = dbpool
@classmethod
def from_crawler(cls,crawler):
db_parmars = {
'host':crawler.settings['MYSQL_HOST'],
'user':crawler.settings['MYSQL_USER'],
'passwd':crawler.settings['MYSQL_PWD'],
'db':crawler.settings['MYSQL_DB'],
'port':crawler.settings['MYSQL_PORT'],
'charset':crawler.settings['MYSQL_CHARSET']
}
dbpool = adbapi.ConnectionPool('pymysql',**db_parmars)
return cls(dbpool)
def process_item(self,item,spider):
query = self.dbpool.runInteraction(
self.insert_data_to_mysql,
item
)
query.addErrback(
self.insert_err,
item
)
return item
def insert_data_to_mysql(self,cursor,item):
data_dict = dict(item)
sql,data = item.get_insert_sql_data(data_dict)
cursor.execute(sql,data)
def insert_err(self,failure,item):
print(failure,'插入失敗')
Scrapy Shell
啟動
scrapy shell "http://hr.tencent.com/position.php?&start=0#a"
scrapy shell -s USER_AGENT="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36" "http://hr.tencent.com/position.php?&start=0#a"
相關文章
- Python scrapy爬蟲框架簡介Python爬蟲框架
- scrapy框架簡介和基礎應用框架
- Scrapy框架的使用之Scrapy框架介紹框架
- Scrapy 框架介紹之 Puppeteer 渲染框架
- Python爬蟲之scrapy框架簡介及環境安裝Python爬蟲框架
- scrapy的簡介與安裝
- Scrapy框架框架
- 爬蟲代理 Scrapy 框架詳細介紹 2爬蟲框架
- HTML 框架簡介HTML框架
- Flask 框架簡介Flask框架
- Django框架簡介Django框架
- graphicsview框架簡介View框架
- Scrapy架構及資料流圖簡介架構
- Scrapy框架的使用之Scrapy入門框架
- Python爬蟲 --- 2.3 Scrapy 框架的簡單使用Python爬蟲框架
- Scrapy框架-Spider框架IDE
- scrapy爬蟲框架爬蟲框架
- Hibernate框架簡介⑤框架
- Hibernate框架簡介④框架
- Hibernate框架簡介③框架
- Hibernate框架簡介②框架
- Hibernate框架簡介①框架
- Spring框架簡介⑩Spring框架
- Spring框架簡介⑨Spring框架
- Spring框架簡介⑧Spring框架
- SpringMVC框架簡介②SpringMVC框架
- SpringMVC框架簡介①SpringMVC框架
- [轉]SSH框架簡介框架
- Spring框架簡介⑦Spring框架
- Spring框架簡介⑥Spring框架
- Spring框架簡介⑤Spring框架
- Spring框架簡介④Spring框架
- Spring框架簡介③Spring框架
- Spring框架簡介②Spring框架
- Spring框架簡介①Spring框架
- [原]ZolltyMVC框架簡介MVC框架
- 【SSH】--SSH框架簡介框架
- Scrapy框架的使用之Scrapy通用爬蟲框架爬蟲