1. 程式人生 > >爬取豆瓣的圖書資訊

爬取豆瓣的圖書資訊

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