天天看點

python爬蟲寫入資料庫_python網絡爬蟲抓取動态網頁并将資料存入資料庫MySQL

簡述

以下的代碼是使用python實作的網絡爬蟲,抓取動态網頁 http://hb.qq.com/baoliao/ 。此網頁中的最新、精華下面的内容是由JavaScript動态生成的。審查網頁元素與網頁源碼是不同。

python爬蟲寫入資料庫_python網絡爬蟲抓取動态網頁并将資料存入資料庫MySQL
python爬蟲寫入資料庫_python網絡爬蟲抓取動态網頁并将資料存入資料庫MySQL

以上是網頁源碼

python爬蟲寫入資料庫_python網絡爬蟲抓取動态網頁并将資料存入資料庫MySQL
python爬蟲寫入資料庫_python網絡爬蟲抓取動态網頁并将資料存入資料庫MySQL

以上是審查網頁元素

是以此處不能簡單的使用正規表達式來擷取内容。

以下是完整的擷取内容并存儲到資料庫的思路及源碼。

實作思路:

抓取實際通路的動态頁面的url – 使用正規表達式擷取需要的内容 – 解析内容 – 存儲内容

以上部分過程文字解釋:

抓取實際通路的動态頁面的url:

在火狐浏覽器中,右鍵打開插件 使用**firebug審查元素** *(沒有這項的,要安裝firebug插件),找到并打開**網絡(NET)**标簽頁。重新加載網頁,獲得網頁的響應資訊,包括連接配接位址。每個連接配接位址都可以在浏覽器中打開。本網站的動态網頁通路位址是:

http://baoliao.hb.qq.com/api/report/NewIndexReportsList/cityid/18/num/20/pageno/1?callback=jQuery183019859437816181613_1440723895018&_=1440723895472

正規表達式:

正規表達式的使用有兩種思路,可以參考個人有關其簡述:python實作簡單爬蟲以及正規表達式簡述

更多的細節介紹可以參考網上資料,搜尋關鍵詞: 正規表達式 python

json:

參考網上有關json的介紹,搜尋關鍵詞: json python

存儲到資料庫:

參考網上的使用介紹,搜尋關鍵詞: 1,mysql 2,mysql python

源碼及注釋

注意:使用python的版本是 2.7

#!/usr/bin/python#指明編碼#-*- coding: UTF-8 -*-

#導入python庫

importurllibimporturllib2importreimportMySQLdbimportjson#定義爬蟲類

classcrawl1:def getHtml(self,url=None):#代理

user_agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0"header={"User-Agent":user_agent}

request=urllib2.Request(url,headers=header)

response=urllib2.urlopen(request)

html=response.read()returnhtmldefgetContent(self,html,reg):

content=re.findall(html, reg, re.S)returncontent#連接配接資料庫 mysql

defconnectDB(self):

host="192.168.85.21"dbName="test1"user="root"password="123456"

#此處添加charset='utf8'是為了在資料庫中顯示中文,此編碼必須與資料庫的編碼一緻

db=MySQLdb.connect(host,user,password,dbName,charset='utf8')returndb

cursorDB=db.cursor()returncursorDB#建立表,SQL語言。CREATE TABLE IF NOT EXISTS 表示:表createTableName不存在時就建立

defcreatTable(self,createTableName):

createTableSql="CREATE TABLE IF NOT EXISTS"+ createTableName+"(time VARCHAR(40),title VARCHAR(100),text VARCHAR(40),clicks VARCHAR(10))"DB_create=self.connectDB()

cursor_create=DB_create.cursor()

cursor_create.execute(createTableSql)

DB_create.close()print 'creat table'+createTableName+'successfully'

returncreateTableName#資料插入表中

definserttable(self,insertTable,insertTime,insertTitle,insertText,insertClicks):

insertContentSql="INSERT INTO"+insertTable+"(time,title,text,clicks)VALUES(%s,%s,%s,%s)"

#insertContentSql="INSERT INTO "+insertTable+"(time,title,text,clicks)VALUES("+insertTime+" , "+insertTitle+" , "+insertText+" , "+insertClicks+")"

DB_insert=self.connectDB()

cursor_insert=DB_insert.cursor()

cursor_insert.execute(insertContentSql,(insertTime,insertTitle,insertText,insertClicks))

DB_insert.commit()

DB_insert.close()print 'inert contents to'+insertTable+'successfully'url="http://baoliao.hb.qq.com/api/report/NewIndexReportsList/cityid/18/num/20/pageno/1?callback=jQuery183019859437816181613_1440723895018&_=1440723895472"

#正規表達式,擷取js,時間,标題,文本内容,點選量(浏覽次數)

reg_jason=r'.*?jQuery.*?\((.*)\)'reg_time=r'.*?"create_time":"(.*?)"'reg_title=r'.*?"title":"(.*?)".*?'reg_text=r'.*?"content":"(.*?)".*?'reg_clicks=r'.*?"counter_clicks":"(.*?)"'

#執行個體化crawl()對象

crawl=crawl1()

html=crawl.getHtml(url)

html_jason=re.findall(reg_jason, html, re.S)

html_need=json.loads(html_jason[0])printlen(html_need)print len(html_need['data']['list'])

table=crawl.creatTable('yh1')for i in range(len(html_need['data']['list'])):

creatTime=html_need['data']['list'][i]['create_time']

title=html_need['data']['list'][i]['title']

content=html_need['data']['list'][i]['content']

clicks=html_need['data']['list'][i]['counter_clicks']

crawl.inserttable(table,creatTime,title,content,clicks)