Python爬蟲——豆瓣下圖書信息
阿新 • • 發佈:2018-06-23
評論 nbsp 聯網 隨著 安妮寶貝 star 建築 gcs 豆瓣
爬蟲目的:
隨著近年互聯網的發展,網絡上的信息飛速數量增長。在龐大的數據面前想要獲得
期望的信息往往如同大海撈針。通過合理的篩選,在百萬甚至數億計的數據中找到所需
信息,無疑有著非常大的意義。
在豆瓣網下,有很多與日常生活相關的模塊網站
內置的評分評價功能可以為用戶提供很大選擇空間,以豆瓣讀書為例:
其中包含六個大型模塊(文學,流行,文化,生活,經管,科技),內部細分了145個小型模塊。
在以數十萬計的圖書信息中,找到各模塊中熱門好評圖書,對於讀者或是書商都是很重要的。
爬蟲代碼概述
一.數據存儲
csv文件存儲,為方便後繼使用pandas進行分析,對於爬取的html文件使用BeautifulSoup 進行解析
字段選擇為 : 書名(titles) 作者/出版社(authors) 評分(nums) 評論數(peoples)
1 csvinfo = open(name + ‘.csv‘, ‘ab‘) 2 begcsv = csv.writer(csvinfo) 3 begcsv.writerow([‘titles‘, ‘authors‘, ‘nums‘, ‘peoples‘]) 4 csvinfo.close()
二.網頁解析
html中書名(titles) 作者/出版社(authors) 評分(nums) 評論數(peoples)等字段對應selector分別為:
#subject_list > ul > li > div.info > h2 > a
#subject_list > ul > li > div.info > div.pub
#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums
#subject_list > ul > li > div.info > div.star.clearfix > span.pl
解析代碼如下 :
1 # 爬取指定name模塊的url,並存儲至name.csv文件 2 def web(url, name): 3 db_data = requests.get(url, headers=header) 4 soup = BeautifulSoup(db_data.text, ‘lxml‘) 5 titles = soup.select(‘#subject_list > ul > li > div.info > h2 > a‘) 6 authors = soup.select(‘#subject_list > ul > li > div.info > div.pub‘) 7 nums = soup.select(‘#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums‘) 8 peoples = soup.select(‘#subject_list > ul > li > div.info > div.star.clearfix > span.pl‘) 9 10 for title, author, num, people in zip(titles, authors, nums, peoples): 11 data = [ 12 ( 13 title.get(‘title‘), 14 author.get_text().replace(‘ ‘, ‘‘).replace("\n", ""), 15 num.get_text().replace(‘ ‘, ‘‘).replace("\n", ""), 16 people.get_text().replace(‘ ‘, ‘‘).replace("\n", "") 17 ) 18 ] 19 csvfile = open(name + ‘.csv‘, ‘ab‘) 20 writer = csv.writer(csvfile) 21 print(data) 22 writer.writerows(data) 23 csvfile.close()
三.請求頭設置
1 header = { 2 ‘Accept‘: ‘*/*;‘, 3 ‘Connection‘: ‘keep-alive‘, 4 ‘Accept-Language‘: ‘zh-CN,zh;q=0.9‘, 5 ‘Accept-Encoding‘: ‘gzip, deflate, br‘, 6 ‘Host‘: ‘book.douban.com‘, 7 ‘User-Agent‘: ‘Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36‘ 8 }
四.圖書分頁
在豆瓣的反爬蟲機制中,正常人瀏覽習慣只會查看靠前的頁碼,而位於後面的一般不會查看,
所以豆瓣將50頁之後的書籍信息設置為只能通過搜索查詢,在分頁中無法查看。url規則為每頁加20,get請求,所以在確定標簽後,可以修改start值來換頁。
代碼:
1 # name模塊標簽分頁 指定為前50頁 2 def setCsv(name): 3 url = ‘https://book.douban.com/tag/‘ + name 4 urls = [(‘https://book.douban.com/tag/‘ + name + ‘?start={}&type=T‘).format(str(i)) for i in range(20, 980, 20)] 5 info(name=name) 6 web(url, name) 7 for single_url in urls: 8 print(single_url) 9 web(single_url, name=name)
五.完整代碼
1 # -*- coding: utf-8 -*- 2 from bs4 import BeautifulSoup 3 import requests 4 import csv 5 import sys 6 7 reload(sys) 8 sys.setdefaultencoding(‘utf-8‘) 9 10 # 請求頭設置 11 header = { 12 ‘Accept‘: ‘*/*;‘, 13 ‘Connection‘: ‘keep-alive‘, 14 ‘Accept-Language‘: ‘zh-CN,zh;q=0.9‘, 15 ‘Accept-Encoding‘: ‘gzip, deflate, br‘, 16 ‘Host‘: ‘book.douban.com‘, 17 ‘User-Agent‘: ‘Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36‘ 18 } 19 20 21 # 初始化csv文件 22 def info(name): 23 csvinfo = open(name + ‘.csv‘, ‘ab‘) 24 begcsv = csv.writer(csvinfo) 25 begcsv.writerow([‘titles‘, ‘authors‘, ‘nums‘, ‘peoples‘]) 26 csvinfo.close() 27 28 29 # 爬取指定name模塊的url,並存儲至name.csv文件 30 def web(url, name): 31 db_data = requests.get(url, headers=header) 32 soup = BeautifulSoup(db_data.text, ‘lxml‘) 33 titles = soup.select(‘#subject_list > ul > li > div.info > h2 > a‘) 34 authors = soup.select(‘#subject_list > ul > li > div.info > div.pub‘) 35 nums = soup.select(‘#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums‘) 36 peoples = soup.select(‘#subject_list > ul > li > div.info > div.star.clearfix > span.pl‘) 37 38 for title, author, num, people in zip(titles, authors, nums, peoples): 39 data = [ 40 ( 41 title.get(‘title‘), 42 author.get_text().replace(‘ ‘, ‘‘).replace("\n", ""), 43 num.get_text().replace(‘ ‘, ‘‘).replace("\n", ""), 44 people.get_text().replace(‘ ‘, ‘‘).replace("\n", "") 45 ) 46 ] 47 csvfile = open(name + ‘.csv‘, ‘ab‘) 48 writer = csv.writer(csvfile) 49 print(data) 50 writer.writerows(data) 51 csvfile.close() 52 53 54 # name模塊標簽分頁 指定為前50頁 55 def setCsv(name): 56 url = ‘https://book.douban.com/tag/‘ + name 57 urls = [(‘https://book.douban.com/tag/‘ + name + ‘?start={}&type=T‘).format(str(i)) for i in range(20, 980, 20)] 58 info(name=name) 59 web(url, name) 60 for single_url in urls: 61 print(single_url) 62 web(single_url, name=name) 63 64 65 if __name__ == ‘__main__‘: 66 setCsv(str) #str為標簽名
六.數據結果
1 wber@wber:~/桌面$ tree -h 數據 2 數據 3 ├── [4.0K] 經管 4 │ ├── [ 41K] 策劃.csv 5 │ ├── [ 79K] 創業.csv 6 │ ├── [ 70K] 股票.csv 7 │ ├── [ 98K] 管理.csv 8 │ ├── [ 67K] 廣告.csv 9 │ ├── [ 90K] 金融.csv 10 │ ├── [ 95K] 經濟學.csv 11 │ ├── [ 79K] 理財.csv 12 │ ├── [ 43K] 企業史.csv 13 │ ├── [ 94K] 商業.csv 14 │ ├── [ 89K] 投資.csv 15 │ └── [ 86K] 營銷.csv 16 ├── [4.0K] 科技 17 │ ├── [ 19K] UCD.csv 18 │ ├── [ 21K] UE.csv 19 │ ├── [ 64K] web.csv 20 │ ├── [ 92K] 編程.csv 21 │ ├── [ 43K] 程序.csv 22 │ ├── [ 89K] 互聯網.csv 23 │ ├── [ 33K] 交互.csv 24 │ ├── [ 64K] 交互設計.csv 25 │ ├── [ 66K] 科技.csv 26 │ ├── [100K] 科普.csv 27 │ ├── [ 99K] 科學.csv 28 │ ├── [5.8K] 神經網絡.csv 29 │ ├── [ 48K] 算法.csv 30 │ ├── [ 20K] 通信.csv 31 │ └── [ 65K] 用戶體驗.csv 32 ├── [4.0K] 流行 33 │ ├── [ 23K] J.K.羅琳.csv 34 │ ├── [ 67K] 阿加莎·克裏斯蒂.csv 35 │ ├── [ 37K] 安妮寶貝.csv 36 │ ├── [ 18K] 滄月.csv 37 │ ├── [ 81K] 穿越.csv 38 │ ├── [ 75K] 耽美.csv 39 │ ├── [ 76K] 東野圭吾.csv 40 │ ├── [ 21K] 高木直子.csv 41 │ ├── [ 37K] 古龍.csv 42 │ ├── [ 22K] 郭敬明.csv 43 │ ├── [ 50K] 韓寒.csv 44 │ ├── [106K] 繪本.csv 45 │ ├── [ 40K] 幾米.csv 46 │ ├── [ 49K] 金庸.csv 47 │ ├── [ 99K] 科幻.csv 48 │ ├── [ 97K] 科幻小說.csv 49 │ ├── [ 19K] 落落.csv 50 │ ├── [ 98K] 漫畫.csv 51 │ ├── [ 91K] 魔幻.csv 52 │ ├── [ 98K] 奇幻.csv 53 │ ├── [ 90K] 青春.csv 54 │ ├── [ 85K] 青春文學.csv 55 │ ├── [ 86K] 日本漫畫.csv 56 │ ├── [ 65K] 三毛.csv 57 │ ├── [ 96K] 推理.csv 58 │ ├── [ 97K] 推理小說.csv 59 │ ├── [ 83K] 網絡小說.csv 60 │ ├── [ 76K] 武俠.csv 61 │ ├── [ 46K] 校園.csv 62 │ ├── [ 94K] 懸疑.csv 63 │ ├── [ 84K] 言情.csv 64 │ ├── [ 62K] 亦舒.csv 65 │ ├── [ 80K] 張小嫻.csv 66 │ └── [ 14K] 張悅然.csv 67 ├── [4.0K] 生活 68 │ ├── [ 82K] 愛情.csv 69 │ ├── [ 93K] 成長.csv 70 │ ├── [ 49K] 家居.csv 71 │ ├── [ 80K] 健康.csv 72 │ ├── [ 93K] 教育.csv 73 │ ├── [ 88K] 勵誌.csv 74 │ ├── [ 70K] 兩性.csv 75 │ ├── [ 89K] 靈修.csv 76 │ ├── [ 85K] 旅行.csv 77 │ ├── [ 82K] 美食.csv 78 │ ├── [ 85K] 女性.csv 79 │ ├── [ 83K] 情感.csv 80 │ ├── [ 58K] 人際關系.csv 81 │ ├── [ 85K] 攝影.csv 82 │ ├── [ 89K] 生活.csv 83 │ ├── [ 67K] 手工.csv 84 │ ├── [100K] 心理.csv 85 │ ├── [ 64K] 養生.csv 86 │ ├── [ 80K] 遊記.csv 87 │ ├── [ 86K] 職場.csv 88 │ └── [ 21K] 自助遊.csv 89 ├── [4.0K] 文化 90 │ ├── [ 93K] 傳記.csv 91 │ ├── [ 94K] 電影.csv 92 │ ├── [ 77K] 二戰.csv 93 │ ├── [ 69K] 佛教.csv 94 │ ├── [ 76K] 國學.csv 95 │ ├── [ 78K] 回憶錄.csv 96 │ ├── [ 88K] 繪畫.csv 97 │ ├── [ 86K] 建築.csv 98 │ ├── [ 75K] 近代史.csv 99 │ ├── [ 76K] 軍事.csv 100 │ ├── [ 61K] 考古.csv 101 │ ├── [ 91K] 歷史.csv 102 │ ├── [ 82K] 美術.csv 103 │ ├── [ 89K] 人文.csv 104 │ ├── [ 85K] 人物傳記.csv 105 │ ├── [ 91K] 社會.csv 106 │ ├── [ 93K] 社會學.csv 107 │ ├── [ 90K] 設計.csv 108 │ ├── [ 84K] 數學.csv 109 │ ├── [ 90K] 思想.csv 110 │ ├── [ 89K] 文化.csv 111 │ ├── [ 90K] 西方哲學.csv 112 │ ├── [ 79K] 戲劇.csv 113 │ ├── [102K] 心理學.csv 114 │ ├── [ 96K] 藝術.csv 115 │ ├── [ 82K] 藝術史.csv 116 │ ├── [ 82K] 音樂.csv 117 │ ├── [ 95K] 哲學.csv 118 │ ├── [ 90K] 政治.csv 119 │ ├── [ 89K] 政治學.csv 120 │ ├── [ 80K] 中國歷史.csv 121 │ ├── [ 67K] 自由主義.csv 122 │ └── [ 86K] 宗教.csv 123 └── [4.0K] 文學 124 ├── [ 32K] 茨威格.csv 125 ├── [ 66K] 村上春樹.csv 126 ├── [ 67K] 當代文學.csv 127 ├── [ 19K] 杜拉斯.csv 128 ├── [ 89K] 兒童文學.csv 129 ├── [ 24K] 港臺.csv 130 ├── [ 76K] 古典文學.csv 131 ├── [ 92K] 經典.csv 132 ├── [ 40K] 魯迅.csv 133 ├── [ 16K] 米蘭·昆德拉.csv 134 ├── [ 84K] 名著.csv 135 ├── [ 23K] 錢鐘書.csv 136 ├── [ 87K] 日本文學.csv 137 ├── [ 75K] 散文.csv 138 ├── [ 76K] 詩詞.csv 139 ├── [ 87K] 詩歌.csv 140 ├── [ 79K] 隨筆.csv 141 ├── [ 91K] 童話.csv 142 ├── [ 79K] 外國名著.csv 143 ├── [ 99K] 外國文學.csv 144 ├── [ 61K] 王小波.csv 145 ├── [ 89K] 文學.csv 146 ├── [ 88K] 小說.csv 147 ├── [ 31K] 余華.csv 148 ├── [ 73K] 雜文.csv 149 ├── [ 60K] 張愛玲.csv 150 └── [ 71K] 中國文學.csv 151 152 6 directories, 142 files
Python爬蟲——豆瓣下圖書信息