摘要:項(xiàng)目簡(jiǎn)介豆瓣相信很多人都爬過(guò),我也把我的方法拿出來(lái)交流學(xué)習(xí),我也是菜鳥(niǎo)過(guò)來(lái)的,不會(huì)省略代碼,此教程純屬娛樂(lè),大神勿噴。創(chuàng)建數(shù)據(jù)庫(kù)目標(biāo)網(wǎng)頁(yè)分析這個(gè)教程中,我們需要爬取豆瓣的電影名序號(hào)和相應(yīng)的評(píng)分。
1、項(xiàng)目簡(jiǎn)介
豆瓣相信很多人都爬過(guò),我也把我的方法拿出來(lái)交流學(xué)習(xí),我也是菜鳥(niǎo)過(guò)來(lái)的,不會(huì)省略代碼,此教程純屬娛樂(lè),大神勿噴。
2、工具requests
re
pygal
mysql
Anacond2
3、爬蟲(chóng)完整代碼# encoding:UTF-8 import re import requests import MySQLdb from bs4 import BeautifulSoup headers = {"User-Agent" :"Mozilla/5.0 (Windows NT 10.0; Win64; x64)"} def getPage(get_url): r=requests.get(get_url) response = r.text return response def filterpage(): pageCode = getPage(get_url) pattern = re.compile("(.*?).*?(.*?).*? ",re.S) items = re.findall(pattern,pageCode) pageStories = [] for item in items: pageStories.append([item[0].strip(),item[1].strip(),item[2].strip()]) return pageStories def save_data(): Dbdata=filterpage() db=MySQLdb.connect(host="localhost",user="root",passwd="******",db="movie",charset="utf8") cursor=db.cursor() for a in Dbdata: id=a[0] name=a[1] grade=a[2] #comment=a[3] value=[id,name,grade] cursor.execute("insert into movie_info values(%s,%s,%s)",value) db.commit() def main(): pageStories=filterpage() #print pageStories for story in pageStories: try: print u"序號(hào):",story[0],u"電影名:",story[1], u" 評(píng)分:", story[2] except: pass if __name__ == "__main__": get_url = "https://movie.douban.com/top250/" i=1 while i < 11: main() save_data() print u"頁(yè)碼",i num = i * 25 get_url = "https://movie.douban.com/top250?start=" + str(num) + "&filter=" i = i + 14、前期準(zhǔn)備
install mysql
我是在windows環(huán)境下跑爬蟲(chóng)的,用的是MySQL5.7,下載地址:https://dev.mysql.com/downloa...
值得一提的是,mysql的安裝,window版的mysql安裝起來(lái)說(shuō)實(shí)話還是比較麻煩的,我裝了很久,沒(méi)成功,最后選擇下載壓縮版安裝。安裝完之后,在mysql目錄下創(chuàng)建my.ini配置文件,輸入以下代碼:
[mysqld] tmpdir=F:mysql-5.7.18-winx64 # 安裝目錄 datadir=F:mysql-5.7.18-winx64data # data目錄,沒(méi)有data目錄請(qǐng)手動(dòng)創(chuàng)建 early-plugin-load="" skip-grant-tables
點(diǎn)擊保存,data目錄是mysql初始化會(huì)用到的目錄,一般是空目錄,不然初始化不通過(guò)。特別是“ 服務(wù)沒(méi)有報(bào)告任何錯(cuò)誤。 請(qǐng)鍵入 NET HELPMSG 3534”錯(cuò)誤。然后添加mysql的環(huán)境路徑。
cmd輸入:
cd F:mysql-5.7.18-winx64in # 進(jìn)入bin目錄,不然有可能會(huì)報(bào)錯(cuò) mysqld initialize # 初始化命令 net start mysql # 啟動(dòng)服務(wù)
創(chuàng)建數(shù)據(jù)表,我們需要保存的數(shù)據(jù)有ID,評(píng)分grade,還有電影名name。
mysql>create database movie # 創(chuàng)建movie數(shù)據(jù)庫(kù) mysql>use movie # mysql>create table movie_info (id varchar(100),name varchar(100),grade decimal(3,1));5、目標(biāo)網(wǎng)頁(yè)分析
這個(gè)教程中,我們需要爬取豆瓣top250的電影名、序號(hào)和相應(yīng)的評(píng)分。F12分析網(wǎng)頁(yè)結(jié)構(gòu)。找到有《肖申克的救贖》的代碼處:
1 # 序號(hào) . . . 肖申克的救贖 # 電影名 . . . # 評(píng)分
ok,往后翻,可以看到剩下的都是這類的結(jié)構(gòu),我們找到規(guī)律了,就可以想辦法,把里面的東西給搞出來(lái)。
一般常用的有re模塊和beautifulsoup模塊,我是用re模塊正則匹配,感覺(jué)正則更強(qiáng)大一點(diǎn),漂亮湯模塊用起來(lái)簡(jiǎn)單,但是速度慢。
def getPage(get_url): # 定義一個(gè)抓取網(wǎng)頁(yè)的方法 r=requests.get(get_url) # get到目標(biāo)網(wǎng)頁(yè) response = r.text return response # 返回抓取到的網(wǎng)頁(yè)
爬蟲(chóng)開(kāi)始爬,就是給web服務(wù)器一個(gè)請(qǐng)求,然后抓取到返回信息。
HTTP 請(qǐng)求方法有 OPTIONS、GET、HEAD、post、PUT、DELETE、TRACE、CONNECT,其中比較常用的有g(shù)et和post,其他的都不常見(jiàn),判斷請(qǐng)求方式很重要。自行百度。
6.2 頁(yè)面代碼處理def filterpage(): # 頁(yè)面處理方法 pageCode = getPage(get_url) #傳參 pattern = re.compile("(.*?).*?(.*?).*? ",re.S) items = re.findall(pattern,pageCode) pageStories = [] # 定義一個(gè)空數(shù)組,用來(lái)存分離出來(lái)的數(shù)據(jù) for item in items: # 迭代 pageStories.append([item[0].strip(),item[1].strip(),item[2].strip()])# 去除空格 return pageStories
正則表達(dá)式,在程序剛開(kāi)始,我們導(dǎo)入了python的re模塊,這個(gè)模塊專門(mén)處理正則匹配,詳細(xì)教程點(diǎn)這里
我們用第一個(gè)(.*?)非貪婪匹配來(lái)匹配序號(hào),接著用.*?貪婪匹配匹配不需要的代碼,往后同樣用非貪婪匹配來(lái)匹配我們需要的信息。
接著用strip()方法去除空格。返回得到的字符串pageStories。
6.3 數(shù)據(jù)存儲(chǔ)def save_data(): Dbdata=filterpage() #傳參 db=MySQLdb.connect(host="localhost",user="root",passwd="suyu.123",db="movie",charset="utf8") # 鏈接數(shù)據(jù)庫(kù) cursor=db.cursor() # 定義游標(biāo) for a in Dbdata: # 迭代存儲(chǔ)數(shù)據(jù) id=a[0] name=a[1] grade=a[2] value=[id,name,grade] cursor.execute("insert into movie_info values(%s,%s,%s)",value) # sql命令存數(shù)據(jù) db.commit() # 別忘記提交變更
python操作mysql,感覺(jué)沒(méi)啥好講的了。。
6.4主函數(shù)def main(): pageStories=filterpage() # 傳參 for story in pageStories: # 迭代打印 try: print u"序號(hào):",story[0],u"電影名:",story[1], u" 評(píng)分:", story[2] except: pass
主函數(shù)主要是用來(lái)打印出我們抓取的數(shù)據(jù)。
6.5運(yùn)行程序if __name__ == "__main__": get_url = "https://movie.douban.com/top250/" # 起始網(wǎng)頁(yè) i=1 while i < 11: main() # 運(yùn)行主函數(shù) save_data() # 運(yùn)行存儲(chǔ)函數(shù) print u"頁(yè)碼",i # num = i * 25 get_url = "https://movie.douban.com/top250?start=" + str(num) + "&filter=" i = i + 1
通過(guò)豆瓣top250的頁(yè)面分析可以知道,總共有10頁(yè),所以我們?cè)O(shè)置i<11,整個(gè)豆瓣電影top250的網(wǎng)址很有規(guī)律,第一頁(yè)是:https://movie.douban.com/top250,第二頁(yè)就是:https://movie.douban.com/top2...,這樣的網(wǎng)頁(yè)有規(guī)律,我喜歡,所以我們可以用迭代來(lái)表示所有網(wǎng)頁(yè),豆瓣業(yè)界良心啊。
7、運(yùn)行結(jié)果GitHub地址:https://github.com/legolas-ze...
還有剩下的svg統(tǒng)計(jì)圖,就下次更新吧。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/40694.html
摘要:但是感覺(jué)還是需要一篇的教程,不然沒(méi)有一個(gè)總體的認(rèn)識(shí)。修飾器,表示每天會(huì)執(zhí)行一次,這樣就能抓到最新的電影了。不過(guò)更推薦使用選擇器。既然前端程序員都使用選擇器為頁(yè)面上的不同元素設(shè)置樣式,我們也可以通過(guò)它定位需要的元素。 雖然以前寫(xiě)過(guò) 如何抓取WEB頁(yè)面 和 如何從 WEB 頁(yè)面中提取信息。但是感覺(jué)還是需要一篇 step by step 的教程,不然沒(méi)有一個(gè)總體的認(rèn)識(shí)。不過(guò),沒(méi)想到這個(gè)教程居...
摘要:爬蟲(chóng)初入前端,剛剛接觸,對(duì)于耳聞已久的爬蟲(chóng)非常神往,所以有了這篇文章,項(xiàng)目代碼在文章末尾需求抓取天涯論壇重慶地區(qū)板塊的文章列表信息。 node爬蟲(chóng) 初入前端,剛剛接觸node,對(duì)于耳聞已久的node爬蟲(chóng)非常神往,所以有了這篇文章,項(xiàng)目代碼在文章末尾 需求 抓取天涯論壇重慶地區(qū)板塊的文章列表信息。 使用工具 node.js superagent(客戶端請(qǐng)求代理模塊) cheerio...
摘要:其次,使用后,還需要針對(duì)做特定處理。看到這就可以構(gòu)想一下爬蟲(chóng)的爬取邏輯了。 運(yùn)行環(huán)境 我的運(yùn)行環(huán)境如下: 系統(tǒng)版本 Windows10。 Python版本 Python3.5,推薦使用Anaconda 這個(gè)科學(xué)計(jì)算版本,主要是因?yàn)樗詭б粋€(gè)包管理工具,可以解決有些包安裝錯(cuò)誤的問(wèn)題。去Anaconda官網(wǎng),選擇Python3.5版本,然后下載安裝。 IDE 我使用的是PyCharm,是專...
閱讀 2795·2021-11-22 14:45
閱讀 2941·2021-09-10 11:26
閱讀 3265·2021-09-07 10:18
閱讀 2231·2019-08-30 14:08
閱讀 633·2019-08-29 12:22
閱讀 1400·2019-08-26 13:48
閱讀 2546·2019-08-26 10:24
閱讀 1163·2019-08-23 18:35