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