爬蟲目的:
随着近年網際網路的發展,網絡上的資訊飛速數量增長。在龐大的資料面前想要獲得
期望的資訊往往如同大海撈針。通過合理的篩選,在百萬甚至數億計的資料中找到所需
資訊,無疑有着非常大的意義。
在豆瓣網下,有很多與日常生活相關的子產品網站
Python爬蟲(一)——豆瓣下圖書資訊
内置的評分評價功能可以為使用者提供很大選擇空間,以豆瓣讀書為例:
Python爬蟲(一)——豆瓣下圖書資訊
Python爬蟲(一)——豆瓣下圖書資訊
其中包含六個大型子產品(文學,流行,文化,生活,經管,科技),内部細分了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值來換頁。
Python爬蟲(一)——豆瓣下圖書資訊
代碼:
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