python網路爬蟲(7)爬取靜態資料詳解

白夢偉、發表於2019-06-07

目的

爬取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')

  

 

相關文章