python爬蟲,用Scrapy爬取豆瓣Top250,存入MySQL
小白大四生,雖然是計算機專業,但是對學的幾門編程語言緣分不深,然後自學了python。(這是我後來補得,因為我發現我寫的太籠統了並不適合給新手看,對不起!所以希望大家輕點噴,後面我會從特別特別特別詳細寫的,這個只是個思路吧)
好吧,發這個文章的主要目的是過兩天要去面試爬蟲實習生的崗位了,借著第一次發文章,寫了個小爬蟲,複習複習。下面進入正題。。。
首先,肯定是安裝scrapy的框架,pip install scrapy。。。簡單粗暴。
然後,IDE用的pychram。(就簡單說scrapy的應用吧,詳細的下次寫或者需要的老哥給我發消息什麼的,有求必應!)
開始正題!!!!!!!!
- 1、首先創建一個爬蟲項目:scrapy startproject doubanmovie #doubanmovie 是項目的名稱,創建完應該是這樣一個結構 :
- 2、進入doubanmovie文件夾,用:scrapy genspider xxx 『http://xxx.com』然後自動在spiders文件里生成一個爬蟲主程序的文件:
- 3、分析思路,先分析要爬取的網頁,(本文通過xpath進行解析),獲取想要的內容。比如在豆瓣電影Top250這裡,獲取《肖申克的救贖》電影名,可以通過xpath進行一系列解析,推薦谷歌瀏覽器的xpath-helper工具幫助進行網頁解析。確定我們需要獲取的欄位內容,在本文里我選擇了獲取:電影名(大陸版的名字),導演演員名,評分,和點評的一句話。(就不仔細講xpath匹配規則了,寫這個文章主要是想記錄一下整個流程,同上,有需要的老哥可以給我留言什麼的,有求必應!)
- 4、現在先在items.py文件中寫入我們需要保存的欄位:
name = scrapy.Field() actor = scrapy.Field() rating = scrapy.Field() info = scrapy.Field()
- 5、開始寫douban.py文件
對網頁url進行分析,發現規則前面https://movie.douban.com/top250?start=
等號後面第一頁是0,第二頁是25。。。。。。然後url規則 固定部分加數字
url = https://movie.douban.com/top250?start= page = 0 start_urls = [url+str(page)]
接下來寫parse方法,把之前用xpath分析的網頁結構拿出來
info_list = response.xpath(//div[@class="info"])#匹配每個網頁中的所需要信息,包含下面的所有欄位,用for遍歷在下面對每個需要的數值進行再一次匹配 for data in info_list: item = DoubanmovieItem() item[name] = data.xpath(./div[@class="hd"]/a/span[1]/text()).extract()[0].encode(utf-8) item[actor] = data.xpath(./div[@class="bd"]/p[1]/text()).extract()[0].strip().encode(utf-8) item[rating] = data.xpath(./div//div/span[@class="rating_num"]/text()).extract()[0].encode(utf-8) infos = data.xpath(./div[@class="bd"]/p[@class="quote"]/span/text()).extract() if len(infos)!=0:#判斷info的值是否為空,不進行這一步有的電影信息並沒有會報錯或數據不全 infos = infos[0].strip().encode(utf-8) else: infos = item[info] = infos yield item
上邊是處理每一頁的,需要處理10頁信息,加一個判斷 然後回調函數調用parse方法
if self.page<225: self.page+=25 yield scrapy.Request(self.url+str(self.page), callback=self.parse)
item數據通過yield會交給管道文件處理,下一步就是編寫pipelines.py,並連接資料庫寫入資料庫中
- 6、首先連接資料庫需要導入mysql-python的包(這裡用的python2),需要python3的請百度一下,你就知道。
def __init__(self): #定義一個初始化方法,連接資料庫 self.conn = MySQLdb.connect( host = settings[MYSQL_HOST],#host為資料庫所在服務的ip地址 port = settings[MYSQL_PORT],#埠號 user = settings[MYSQL_USER],#用戶名 passwd = settings[MYSQL_PASSWD],#密碼 db = settings[MYSQL_DB],#資料庫名 charset=utf8,#編碼格式,一定要寫這個,否則會出現亂碼 ) self.cursor = self.conn.cursor()#游標
settings[MYSQL_HOST]等,我是把具體信息寫在了settings文件里,具體格式如下:
MYSQL_HOST = 127.0.0.1MYSQL_PORT = 3306MYSQL_USER = rootMYSQL_PASSWD = xxxx#密碼請寫自己的MYSQL_DB = xxxxx#資料庫也請寫自己的
我選擇在shell界面建表:
create table douban250(id int auto_increment primary key not null,name varchar(100),actor varchar(200),rating varchar(20),info varchar(100));
將數據寫入到資料庫:
try: sql = "insert into douban250(name, actor, rating, info) values(%s,%s,%s,%s)" self.cursor.execute(sql, (item[name], item[actor], item[rating], item[info])) self.conn.commit() except Exception as e: print(e) return item
後面我們進行配置一下settings文件就行了。
最終數據存入資料庫的截圖如下:

截取了一部分(用的navicat,能在win下連接我的ubuntu資料庫,然後從圖形界面操作)
最後我詳細的代碼我上傳到github上了,貼上我的地址:
https://github.com/MRLLL1/spider-doubanTop250
新手第一次寫文章,什麼邏輯錯誤,錯別字請大家海涵。大概就寫成這樣吧,有問題歡迎大家問我,如果看到了保證回復。(祝福周一面試能成功!!!)
推薦閱讀:
※關於在pycharm中配置導入路徑的問題?
※請問scrapy源碼的入口是哪個?
※[python]scrapy框架構建(2.7版本)
※你懂Scrapy嗎?Scrapy大型爬蟲框架講解【一】
※為何抵觸爬蟲?


