目的
爬取http://seputu.com/資料並儲存csv檔案
匯入庫
lxml用於解析解析網頁HTML等原始碼,提取資料。一些參考:https://www.cnblogs.com/zhangxinqi/p/9210211.html
requests請求網頁
chardet用於判斷網頁中的字元編碼格式
csv用於儲存文字使用。
re用於正規表示式
from lxml import etree import requests import chardet import csv import re
獲取網頁
生成網頁頭帶入到request.get中,可以模擬瀏覽器。其中的網頁頭,可以在瀏覽器控制檯,network下查詢到。
user_agent='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0' headers={'User-Agent':user_agent} r=requests.get('http://seputu.com/',headers=headers)
判斷並轉換編碼
r.encoding=chardet.detect(r.content)['encoding']
解析網頁
html=etree.HTML(r.text)
提取網頁資訊
瀏覽器開啟對應網站,找到要提取的標籤,通過元素審查,完成html文字內容的抽取。
這裡抽取的內容為h2_title,href,title內容。title通過正規表示式完成分組,並進行資料提取。
注意的是:python正規表示式部分,不支援部分的零寬斷言語法,採用分組方案,避開了可能出現的錯誤!
如以下程式碼會出錯:
import re box_title='[2012-5-23 21:14:42] 盜墓筆記 賀歲篇 真相' pattern=re.compile(r'(?<=\[.*\]\s).*') result1=re.search(pattern, box_title)
rows儲存了二維資料,用於寫入csv檔案。
div_mulus=html.xpath('.//*[@class="mulu"]') rows=[] for div_mulu in div_mulus: div_h2=div_mulu.xpath('./div[@class="mulu-title"]/center/h2/text()') if len(div_h2)>0: h2_title=div_h2[0] a_s=div_mulu.xpath('./div[@class="box"]/ul/li/a') for a in a_s: href=a.xpath('./@href')[0] box_title=a.xpath('./@title')[0] pattern=re.compile(r'\s*\[(.*)\]\s+(.*)') result1=re.search(pattern, box_title) rows.append([h2_title,result1.group(2),href,result1.group(1)]) pass pass pass
儲存資料
建立header一維資料,配合之前rows二維資料,通過w許可權,配合writer方法,完成一維、二維的資料寫入
通過最後的輸出,標記正常完成。
headers=['title','real_title','href','date'] with open('text.csv','w') as f: f_csv=csv.writer(f,) f_csv.writerow(headers) f_csv.writerows(rows) print('finished')