正則表達式+CSV實戰

本文使用正則表達式抓取豆瓣top250電影信息,存儲到csv文件中

抓取信息

本文假設讀者對正則表達式已經非常熟悉了,如果不熟悉的可以到網上找相關教程。

下面我們抓取豆瓣信息列印出來

import requestsimport reimport csvdef parse(text): pattern = re.compile(<li>.*?"title">(.*?)<+ .*?"title">(.*?)<.*?"other">(.*?)<+ .*?"playable">[(.*?)]+ # 注意方括弧要轉義 .*?"bd".*?p class="">(.*?)<+ # 注意class後面有="" .*?"star".*?rating(.*?)-t+ .*?"v:average">(.*?)<+ .*?<span>(d+)人+ .*?inq">(.*?)<.*?</li>, re.S) for item in re.findall(pattern, text): yield { title: item[0], other_title: (item[1].replace(&nbsp;, ) + item[2].replace(&nbsp;, )).replace( , ), playable: item[3], info: item[4].replace(&nbsp;, ).strip(), star: ..join(list(item[5])), score: item[6], comment_num: item[7], quote: item[8] }def get_all(): for i in range(10): url = https://movie.douban.com/top250?start={}&filter=.format(i*25) text = requests.get(url).text yield from parse(text)def main(): data = list(get_all()) print(data)if __name__ == __main__: main()

使用正則匹配的基本形式是這樣的<>(.*?)</>。上面只涉及提取,如果提取有困難可以考慮使用re.sub刪除掉一些干擾字元,再進行提取。

存儲CSV

直接上代碼

import requestsimport reimport csvdef parse(text): pattern = re.compile(<li>.*?"title">(.*?)<+ .*?"title">(.*?)<.*?"other">(.*?)<+ .*?"playable">[(.*?)]+ # 注意方括弧要轉義 .*?"bd".*?p class="">(.*?)<+ # 注意class後面有="" .*?"star".*?rating(.*?)-t+ .*?"v:average">(.*?)<+ .*?<span>(d+)人+ .*?inq">(.*?)<.*?</li>, re.S) for item in re.findall(pattern, text): yield { title: item[0], other_title: (item[1].replace(&nbsp;, ) + item[2].replace(&nbsp;, )).replace( , ), playable: item[3], info: item[4].replace(&nbsp;, ).strip(), star: ..join(list(item[5])), score: item[6], comment_num: item[7], quote: item[8] }def get_all(): for i in range(10): url = https://movie.douban.com/top250?start={}&filter=.format(i*25) text = requests.get(url).text yield from parse(text)def main(): data = list(get_all()) with open(movies.csv, w, encoding = utf-8) as f: w = csv.DictWriter(f, fieldnames = data[0].keys()) w.writeheader() w.writerows(data)if __name__ == __main__: main()

這裡使用DictWriter來用字典存入,一般都是用Write將列表存入。這裡用writerows一次存入多個字典,也可以用循環配合writerow一條一條寫入。

抓取結果如下所示

讀取CSV文件方法如下

import csvdata_list = []with open(movies.csv, r, encoding = utf-8) as f: data = csv.DictReader(f) for datai in data: data_list.append(datai)print(data_list)

對爬蟲基礎部分有問題的讀者可以參考下面文章

  • 爬蟲基本原理
  • 爬蟲代碼改進之生成器與類的使用

專欄信息

專欄主頁:python編程

專欄目錄:目錄

爬蟲目錄:爬蟲系列目錄

版本說明:軟體及包版本說明

推薦閱讀:

TAG:Python | 爬蟲計算機網路 | python爬蟲 |