簡述
如下的代碼是使用python實現的網絡爬蟲,抓取動態網頁 http://hb.qq.com/baoliao/ 。此網頁中的最新、精華下面的內容是由JavaScript動態生成的。審查網頁元素與網頁源碼是不一樣。html
如下是網頁源碼python
以上是審查網頁元素mysql
因此此處不能簡單的使用正則表達式來獲取內容。正則表達式
如下是完整的獲取內容並存儲到數據庫的思路及源碼。sql
實現思路:
抓取實際訪問的動態頁面的url – 使用正則表達式獲取須要的內容 – 解析內容 – 存儲內容數據庫
以上部分過程文字解釋:json
抓取實際訪問的動態頁面的url:api
在火狐瀏覽器中,右鍵打開插件 使用**firebug審查元素** *(沒有這項的,要安裝firebug插件),找到並打開**網絡(NET)**標籤頁。從新加載網頁,得到網頁的響應信息,包括鏈接地址。每一個鏈接地址均可以在瀏覽器中打開。本網站的動態網頁訪問地址是:瀏覽器
在火狐瀏覽器中,右鍵打開插件 使用**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庫 import urllib import urllib2 import re import MySQLdb import json #定義爬蟲類 class crawl1: 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() return html def getContent(self,html,reg): content=re.findall(html, reg, re.S) return content #鏈接數據庫 mysql def connectDB(self): host="192.168.85.21" dbName="test1" user="root" password="123456" #此處添加charset='utf8'是爲了在數據庫中顯示中文,此編碼必須與數據庫的編碼一致 db=MySQLdb.connect(host,user,password,dbName,charset='utf8') return db cursorDB=db.cursor() return cursorDB #建立表,SQL語言。CREATE TABLE IF NOT EXISTS 表示:表createTableName不存在時就建立 def creatTable(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' return createTableName #數據插入表中 def inserttable(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]) print len(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)