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()