簡述
以下的代碼是使用python實作的網絡爬蟲,抓取動态網頁 http://hb.qq.com/baoliao/ 。此網頁中的最新、精華下面的内容是由JavaScript動态生成的。審查網頁元素與網頁源碼是不同。
以上是網頁源碼
以上是審查網頁元素
是以此處不能簡單的使用正規表達式來擷取内容。
以下是完整的擷取内容并存儲到資料庫的思路及源碼。
實作思路:
抓取實際通路的動态頁面的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)