天天看點

Python爬蟲(一)——豆瓣下圖書資訊

爬蟲目的:
  随着近年網際網路的發展,網絡上的資訊飛速數量增長。在龐大的資料面前想要獲得
期望的資訊往往如同大海撈針。通過合理的篩選,在百萬甚至數億計的資料中找到所需
資訊,無疑有着非常大的意義。
  在豆瓣網下,有很多與日常生活相關的子產品網站
  
        
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 }      

四.圖書分頁

  

Python爬蟲(一)——豆瓣下圖書資訊

    在豆瓣的反爬蟲機制中,正常人浏覽習慣隻會檢視靠前的頁碼,而位于後面的一般不會檢視,

是以豆瓣将50頁之後的書籍資訊設定為隻能通過搜尋查詢,在分頁中無法檢視。url規則為每頁加20,get請求,是以在确定标簽後,可以修改start值來換頁。

Python爬蟲(一)——豆瓣下圖書資訊
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為标簽名      

六.資料結果

Python爬蟲(一)——豆瓣下圖書資訊
Python爬蟲(一)——豆瓣下圖書資訊
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