爬取豆瓣的圖書資訊
阿新 • • 發佈:2019-02-05
emmm,感謝豆瓣提供的平臺,爬也沒那麼多反爬蟲機制。於是順手爬了。。。
# coding:utf-8
# 採集豆瓣書資訊和圖片,寫進資料庫from urllib import parse
from urllib import request
from lxml import etree
import json, pymysql
import time
biaoqianmen=[ '外國文學','文學' ,'隨筆' ,
'中國文學' ,'經典' ,'日本文學' ,'散文' ,
'村上春樹' ,'詩歌' ,'童話' ,'兒童文學' ,
'古典文學' ,'王小波' ,'雜文' ,'名著',
'餘華' ,'張愛玲' ,'當代文學' ,'錢鍾書' ,
'外國名著' ,'魯迅' ,'詩詞' ,'茨威格' ,
'米蘭·昆德拉' ,'杜拉斯' ,'港臺' ,
'漫畫 ,推理' ,'繪本' ,'青春' ,
'東野圭吾' ,'科幻' ,'言情' ,'懸疑' ,
'奇幻' ,'武俠','日本漫畫' ,'韓寒' ,
'耽美' ,'推理小說','亦舒' ,'三毛' ,
'網路小說' ,'安妮寶貝','郭敬明' ,'穿越' ,
'金庸' ,'阿加莎·克里斯蒂' ,'輕小說' ,'科幻小說' ,
'幾米' ,'青春文學' ,'魔幻' ,'幾米' ,
'張小嫻' ,
'滄月' ,'校園' ,'落落' ,'張悅然' ,
'歷史' ,'心理學' ,'哲學' ,'傳記' ,
'文化' ,'社會學' ,'藝術' ,'設計' ,
'社會','政治','建築' ,'宗教' ,
'電影 ','數學' ,'政治學' ,'回憶錄' ,
'中國歷史' ,'思想' ,'國學' ,'人文' ,
'音樂 ','人物傳記' ,'繪畫' ,'藝術史' ,
'戲劇 ','佛教' ,'軍事' ,'二戰' ,
'西方哲學' ,'近代史' ,'考古' ,'自由主義' ,
'美術 ',
'愛情 ','旅行' ,
'勵志 ','心理' ,
'職場 ','教育' ,
'靈脩 ','健康' ,
'兩性 ','養生' ,
'自助遊' ,
'科普' ,'網際網路' ,'程式設計' ,'科學' ,
'互動設計' ,'使用者體驗' ,'演算法' ,'科技' ,'通訊' ,'互動' ,'神經網路' ,'程式' ,
]
url = 'https://book.douban.com/tag/'
headers = {
'Host': 'book.douban.com',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
}
content_dict_allli=[]
for k in biaoqianmen:
print(k)
try:
for i in range(30):
url = 'https://book.douban.com/tag/'
url+=(parse.quote(k)+"?start="+str(i*20)+"&type=T")
print(url)
req = request.Request(url=url, headers=headers, method="GET")
content = request.urlopen(req).read().decode("utf-8")
content_dict = etree.HTML(content) # 格式化
content_dict_allli.extend(content_dict.xpath(r'//*[@id="subject_list"]/ul/li')) # 拿到列表
print(i)
time.sleep(0.1)
except Exception:
pass
for li in content_dict_allli:
try:
time.sleep(0.01)
# 書名/標題
title_list = li.xpath(r'div[2]/h2/a/@title') # 取標籤裡的內容,注意地址是相對地址,不能直接拿來用 (注:和bs4不一樣)
title = title_list[0]
title = title.replace(" ", '')
#print(title)
# 資訊 作者、出版社
info_list = li.xpath(r'div[2]/div[1]/text()')
author = info_list[0].split('/')[0]
author = author.replace('\n', '').replace(" ", '')
chubanshe = info_list[0].split('/')[1]
#print(author)
#print(chubanshe)
# 評分
pingfen_list = li.xpath(r'div[2]/div[2]/span[2]/text()')
pingfen = pingfen_list[0]
#print(pingfen)
# 圖片
img_net_addr = li.xpath(r'div[1]/a/img/@src')
img_net_addr = img_net_addr[0]
#print(img_net_addr)
#data = request.urlopen(img_net_addr).read()
#img_name = 'F:\py3\爬蟲系列\豆瓣\douban\\' + title + str('.jpg')
#with open(img_name, 'wb')as f:
# f.write(data)
#簡介
url=li.xpath(r'div[1]/a/@href')
tushuurl=url[0]
reqq = request.Request(url=tushuurl, headers=headers, method="GET")
contentq = request.urlopen(reqq).read().decode("utf-8")
jianjiedict = etree.HTML(contentq) # 格式化
#content_dict.xpath(r'//*[@id="subject_list"]/ul/li')
wordf=jianjiedict.xpath(r'//*[@class="intro"]/p/text()')
zuopingjianjie=wordf[0]
zuozhe=wordf[1]
biaoqian=jianjiedict.xpath(r'//a[@class=" tag"]/text()')
kong=''
for i in biaoqian:
kong+=i
kong+='#'
# 資料庫,請改為自己的資料庫
db = pymysql.connect(host='localhost', port=3306, user="", password='', db='douban', charset='utf8') #
cur = db.cursor()
sql = "insert into douban(title,author,chubanshe,pingfen,picture,zuopingjianjie,zuozhe,biaoqian)values('%s','%s','%s','%s','%s','%s','%s','%s')" % (
title, author, chubanshe, pingfen,img_net_addr,zuopingjianjie,zuozhe,kong)
print(sql)
cur.execute(sql)
db.commit()
except Exception:
pass
db.close()