正則表達式+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( , ) + item[2].replace( , )).replace( , ), playable: item[3], info: item[4].replace( , ).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( , ) + item[2].replace( , )).replace( , ), playable: item[3], info: item[4].replace( , ).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編程
專欄目錄:目錄
爬蟲目錄:爬蟲系列目錄
版本說明:軟體及包版本說明
推薦閱讀: