利用python scrapy mysql爬取虎撲NBA球員資料存入資料庫

利用python scrapy mysql爬取虎撲NBA球員資料存入資料庫

  大家好,這是我的第一篇部落格,寫的不好請見諒。

小編是個多年的NBA觀眾,最近正值季後賽的比賽,閒來無事,突發奇想,想利用剛剛所學的python著名爬蟲框架scrapy採集一下全NBA的球員基本資訊。好了閒話不多說,讓我們開始吧!

                                                                

一.環境配置

1.安裝python3.6,並且配置環境變數,開啟cmd,輸入python 顯示以下內容說明安裝成功。

2.python安裝好了,然後安裝scrapy框架

可以直接去點選開啟連結這裡按Shift f組合鍵開啟搜尋框,輸入scrapy,下載最新版本的scrapy。

(1)

(2)  scrapy依賴twiste包,我們還是去點選這裡去下載這個包。

  (3)     安裝 lxml解析庫,這個直接在cmd中輸入pip install lxml即可。

3.然後不要著急啟動,安裝whl檔案需要安裝wheel庫,這裡直接開啟cmd 輸入pip install wheel安裝即可。

4. 以上手動下載的包需要複製到你的python路徑下面,我的是這個路徑,找到Scripts這個資料夾,把剛才下載的 .whl 檔案複製到裡面。

5.然後開啟cmd依次啟動它們 例如 ,啟動scrapy也是同理。

6.如果按照以上步驟完畢之後,在cmd中輸入scrapy -h顯示如下內容,則證明你終於安裝成功了scrapy框架,可以正式開始了!

二 開始你的第一個scrapy專案

經過以上安裝的痛苦,終於可以開始了。let’s go! 開啟你的cmd ,輸入以下命令

         (XXX是專案的名字,可以自定義)

這裡我建立了一個叫hupu的專案 執行完畢命令後你會發現相應路徑下多了一個資料夾,錯,這就是你的專案資料夾。你的目錄結構應該是這樣的。然後右鍵點選spiders新建一個.py檔案,這個就是你的爬蟲程式碼檔案。我起了一個叫players.py檔案

                                                                                 

下面來簡單介紹一下各個檔案作用:

     1、Items是將要裝載抓取的資料的容器,它工作方式像python裡面的字典。定義它的屬性為scrpiy.item.Field物件,就像是一個物件關係對映(ORM). 

    2、Spider是使用者編寫的類,用於從一個域(或域組)中抓取資訊

    3,  pipelines.py: 專案管道檔案,用於提取Items內容 

    4、settings.py: 專案配置檔案

    5、middlewares.py下載中介軟體。

說到scrapy不得不說下面這張圖:

Scrapy Engine: 這是引擎,負責Spiders、ItemPipeline、Downloader、Scheduler中間的通訊,訊號、資料傳遞等等!(像不像人的身體?)

Scheduler(排程器): 它負責接受引擎傳送過來的requests請求,並按照一定的方式進行整理排列,入隊、並等待Scrapy Engine(引擎)來請求時,交給引擎。

Downloader(下載器):負責下載Scrapy Engine(引擎)傳送的所有Requests請求,並將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spiders來處理,

Spiders:它負責處理所有Responses,從中分析提取資料,獲取Item欄位需要的資料,並將需要跟進的URL提交給引擎,再次進入Scheduler(排程器),

Item Pipeline:它負責處理Spiders中獲取到的Item,並進行處理,比如去重,持久化儲存(存資料庫,寫入檔案,總之就是儲存資料用的)

Downloader Middlewares(下載中介軟體):你可以當作是一個可以自定義擴充套件下載功能的元件

Spider Middlewares(Spider中介軟體):你可以理解為是一個可以自定擴充套件和操作引擎和Spiders中間‘通訊‘的功能元件(比如進入Spiders的Responses;和從Spiders出去的Requests)

參考於 詳情看 這裡   https://cuiqingcai.com/3472.html/comment-page-2#comments

三 編寫你的爬蟲程式碼

(1)首先,我們要明確我們的爬取站點和目標。之前說了,今天我們來爬去虎撲NBA的所有球員資料,來,直接上程式碼https://nba.hupu.com/players/rockets 從這裡開始,這個頁面有各個球隊,各個球員的所有基本資料。目標站點明確了,接下來我們來明確一下我們需要爬的欄位。在items.py裡面定義要爬取的欄位。(這是items.py)

import scrapy
class HupuItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
#球隊
playerteam = scrapy .Field ()
#球員照片
playerimg = scrapy .Field ()
#球員姓名
playername = scrapy .Field ()
#球員號碼
playernumber = scrapy .Field ()
#球員位置
playerjob = scrapy .Field ()
#球員身高
playertall = scrapy .Field ()
#球員體重
playerweight = scrapy .Field ()
#球員生日
playerbirthday = scrapy .Field ()
#球員合同
playercont = scrapy .Field ()
#球員年薪
playersal = scrapy .Field ()

(2)然後,開始編寫你的爬蟲程式碼:(這是我的player.py)

import scrapy
import re
from hupu .items import  HupuItem
class Hupu(scrapy .Spider ):
name = 'hupu'
allowed_domains=['hupu.com']
start_urls = ['https://nba.hupu.com/players/rockets']

匯入scrapy模組,re模組是正則模組,後面要用到的,匯入剛才配好的items檔案。

name 就是你自定義的爬蟲名字,allowed_domains是該爬蟲的允許作用域,start_urls 是起始的開爬的url地址。

然後重寫parse這個方法,這裡我用了xpath方法提取了球隊的名字和球隊的連線

    def parse(self, response):
url_list = response.xpath('//span[@class="team_name"]/a/@href').extract()
playerteam_list = response.xpath('//span[@class="team_name"]/a/text()').extract()

每個球隊的連結都在這個標籤下面,用xpath把它們提取成一個列表。球隊名字也是如此。xpath的用法在這裡就不細說了。

這裡用了迭代的方法,zip打包了兩個球隊名字和球隊連結列表,讓它們平行的迴圈,把球隊的連結傳入到parse_detail函式去處理,meta傳的是個字典型別。

        for url, playerteam in zip(url_list, playerteam_list):
team_url = url
yield scrapy.Request(url=team_url, meta={'playerteam': playerteam}, callback=self.parse_detail)

下面則是parse_detail函式的內容

    def parse_detail(self, response):
print("開始下載...")
item =HupuItem ()
# 球隊
item['playerteam'] = response .meta['playerteam']
#球員照片
player_img_list = response.xpath('//td[@class="td_padding"]//img/@src').extract()
# 球員姓名
player_name_list = response.xpath('//td[@class="left"][1]//a/text()').extract()
# 球員號碼
player_number_list = response.xpath('//tr[not(@class)]/td[3]/text()').extract()
#球員位置
player_job_list = response.xpath('//tr[not(@class)]/td[4]/text()').extract()
# 球員身高
player_tall_list = response.xpath('//tr[not(@class)]/td[5]/text()').extract()
# 球員體重
player_weight_list = response.xpath('//tr[not(@class)]/td[6]/text()').extract()
# 球員生日
player_birthday_list = response.xpath('//tr[not(@class)]/td[7]/text()').extract()
# 球員合同
player_cont_list = response.xpath('//td[@class="left"][2]/text()').extract()
#球員年薪
player_sal_list = response.xpath('//td[@class="left"][2]/b/text()').extract()

這個函式主要是對剛才傳進來的請求url進行分析處理,我們仍然使用xpath來提取網頁上的這些內容(如下)(包括之前傳入的球隊名字)

由於一支隊伍有很多個球員,所以xpath提取的仍然是列表型別。然後再利用for迭代配合zip把每一位球員的資訊遍歷出來,並存入之前設定好的items欄位中,最後yield item。

        zz = zip(player_img_list ,player_name_list,player_number_list,player_job_list,player_tall_list,player_weight_list,player_birthday_list,player_cont_list,player_sal_list)
for player_img,player_name ,player_number,player_job ,player_tall,player_weight,player_birthday,player_cont,player_sal  in zz:
item ["playerimg"]=player_img
item['playername'] = player_name
item['playernumber'] =player_number
item['playerjob'] = player_job
item['playertall'] = player_tall
item['playerweight'] = player_weight
item['playerbirthday'] = player_birthday
if player_cont:
item['playercont'] = player_cont
else:
item['playercont'] = 'NULL'
item['playersal'] = player_sal
yield item

這樣我們就寫完了自定義的爬蟲程式碼了!

(3)執行你的爬蟲程式 

開啟cmd ,把路徑匯入到你spiders下面

輸入  scrapy crawl hupu   即可以執行你的爬蟲了!

輸入這條命令   是在當前資料夾下面生成一個叫hupu的json檔案。

可以看見類似以下內容

再看看資料夾下面有沒有生成json檔案

在json.cn 裡解析json資料

如果以上都沒有問題那麼,接下來我們進行資料入mysql資料庫的操作。

四 資料存入Mysql資料庫

(1)首先要確保計算機上成功安裝了mysql資料庫,安裝就略過了…

  (2)   在你的資料庫中建立相應的表,這是我建立的表

(3)在你的settings檔案中設定一下內容

註冊管道檔案。

ITEM_PIPELINES = {
'hupu.pipelines.HupuPipeline': 300,
'hupu.pipelines.DBPipeline': 10,
}

設定資料庫名字,賬號,密碼 ,埠號等等。

MYSQL_HOST = 'localhost'
MYSQL_DBNMAE = 'hupu'
MYSQL_USER = 'root'
MYSQL_PASSWORD = '123456'

(4)編寫你的管道檔案

import pymysql
from hupu import settings
from scrapy .conf import settings
class DBPipeline(object ):
#連線資料庫
def __init__(self):
self.conn = pymysql.connect(host='127.0.0.1', port=3306,
user = 'root', password = '123456',db='hupu',charset='utf8')
self.cursor = self.conn.cursor()
self .conn .commit()
def process_item(self, item, spider):
try:
self.cursor.execute(
"insert into player_info( playerimg,playerteam,playername,playernumber,playerjob,playertall,playerweight,playerbirthday,playercont,playersal) "
"values(%s ,%s, %s, %s ,%s ,%s, %s, %s, %s,%s)",
(
item["playerimg"],
item['playerteam'],
item['playername'],
item['playernumber'],
item['playerjob'],
item['playertall'],
item['playerweight'],
item['playerbirthday'],
item['playercont'],
item['playersal'])
)
self.conn.commit()
except pymysql .Error :
print("插入錯誤")
return item

這裡利用了遊標,向表中插入資料。

(5)觀察你的資料庫內容

到這裡就大功告成了,我們可以看見全NBA的球員資料都已經在你的資料庫中了!!!