爬蟲系列1:Requests+Xpath 爬取豆瓣電影TOP


爬蟲1:Requests+Xpath 爬取豆瓣電影TOP

【抓取】:參考前文 爬蟲系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html

【分頁】:參考前文 爬蟲系列2:https://www.cnblogs.com/yizhiamumu/p/10267721.html

【保存】:參考前文 爬蟲系列3:https://www.cnblogs.com/yizhiamumu/p/10270926.html

【動態】:參考前文 爬蟲系列4:https://www.cnblogs.com/yizhiamumu/p/10272977.html

 

1 電影名稱

# 1 Requests+Xpath 菜鳥爬取豆瓣TOP 
# 電影名稱

'''
Requests+Xpath 爬取豆瓣電影

安裝 Python 應用包
pip install requests
pip install lxml

獲取元素的Xpath信息並獲得文本:

手動獲取:定位目標元素,在網站上依次點擊:右鍵 > 檢查
file=s.xpath('元素的Xpath信息/text()') 

快捷鍵“shift+ctrl+c”,移動鼠標到對應的元素時即可看到對應網頁代碼:

在電影標題對應的代碼上依次點擊 右鍵 > Copy > Copy XPath,獲取電影名稱的Xpath:


'''

import requests 
from lxml import etree


url = 'https://book.douban.com/top250'
data = requests.get(url).text
s=etree.HTML(data)


film=s.xpath('//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div[1]/a/@title')
print(film)


# 打印:['追風箏的人']

 

2 全部書名

# 2 全部書名

'''
瀏覽器經常會自己在里面增加多余的 tbody 標簽,我們需要手動把這些標簽刪掉。


分別復制《追風箏的人》、《小王子》、《圍城》、《解憂雜貨店》的 xpath 信息進行對比:

//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[1]/a
//*[@id="content"]/div/div[1]/div/table[2]/tbody/tr/td[2]/div[1]/a
//*[@id="content"]/div/div[1]/div/table[3]/tbody/tr/td[2]/div[1]/a
//*[@id="content"]/div/div[1]/div/table[4]/tbody/tr/td[2]/div[1]/a

比較可以發現書名的 xpath 信息僅僅 table 后的序號不一樣,並且跟書的序號一致,於是去掉序號(去掉 tbody),我們可以得到通用的 xpath 信息:

//*[@id=“content”]/div/div[1]/div/table/tr/td[2]/div[1]/a


'''

import requests 
from lxml import etree


url = 'https://book.douban.com/top250'
data = requests.get(url).text
s=etree.HTML(data)


file=s.xpath('//*[@id="content"]/div/div[1]/div/table/tr/td[2]/div[1]/a/@title')

for title in file:
    print(title)



# 打印:
追風箏的人
解憂雜貨店
小王子
白夜行
圍城
挪威的森林
三體
嫌疑人X的獻身
活着
紅樓夢
百年孤獨
不能承受的生命之輕
看見
達·芬奇密碼
平凡的世界(全三部)
三體Ⅱ
三體Ⅲ
簡愛(英文全本)
哈利·波特與魔法石
天才在左 瘋子在右
送你一顆子彈
傲慢與偏見
我們仨
飄
傾城之戀

 

3 爬取頁面多個信息時的數據准確匹配問題

# 3 爬取頁面多個信息時的數據准確匹配問題

# strip(“(”) 表示刪除括號, strip() 表示刪除空白符。

'''

問題:我們默認書名和評分是正確的信息,如果某一項少爬或多爬了信息,匹配錯誤


思路:書名的標簽肯定在這本書的框架內,以每本書為單位,分別取獲取對應的信息,完全匹配

//*[@id=“content”]/div/div[1]/div/table[1]   #整本書
//*[@id=“content”]/div/div[1]/div/table[1]/tr/td[2]/div[1]/a   #書名
//*[@id=“content”]/div/div[1]/div/table[1]/tr/td[2]/div[2]/span[2]   #評分

我們發現,書名和評分 xpath 的前半部分和整本書的 xpath 一致的, 那我們可以通過這樣寫 xpath 的方式來定位信息:

file=s.xpath(“//*[@id=“content”]/div/div[1]/div/table[1]”)
title =div.xpath(“./tr/td[2]/div[1]/a/@title”)
score=div.xpath(“./tr/td[2]/div[2]/span[2]/text()”)

'''


import requests 
import time
from lxml import etree


url = 'https://book.douban.com/top250'
data = requests.get(url).text
s=etree.HTML(data)

file=s.xpath('//*[@id="content"]/div/div[1]/div/table')

for div in file:
    title = div.xpath("./tr/td[2]/div[1]/a/@title")[0]
    href = div.xpath("./tr/td[2]/div[1]/a/@href")[0]
    score = div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0]
    num = div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")")
    scribe = div.xpath("./tr/td[2]/p[2]/span/text()")
    
    time.sleep(2)
    
    print("{}{}{}{}{}".format(title,href,score,num,scribe[0]))


# 打印:

追風箏的人https://book.douban.com/subject/1770782/8.9327174人評價
                為你,千千萬萬遍
解憂雜貨店https://book.douban.com/subject/25862578/8.6298863人評價
                一碗精心熬制的東野牌雞湯,拒絕很難
小王子https://book.douban.com/subject/1084336/9.0252153人評價
                獻給長成了大人的孩子們

 

4 翻頁

# 4翻頁
'''
https://book.douban.com/top250?start=0 #第一頁
https://book.douban.com/top250?start=25 #第二頁
https://book.douban.com/top250?start=50 #第三頁

以每頁25為單位,遞增25,只是 start=()的數字不一樣

寫一個循環

for a in range(3):    
  url = 'https://book.douban.com/top250?start={}'.format(a*25)
  #3個頁面,用 a*25 保證以25為單位遞增
  
'''

import requests 
import time 
from lxml import etree


for a in range(3):
    url = 'https://book.douban.com/top250?start={}'.format(a*25)
    data = requests.get(url).text

    s=etree.HTML(data)
    file=s.xpath('//*[@id="content"]/div/div[1]/div/table')
    time.sleep(3)

    for div in file:
        title = div.xpath("./tr/td[2]/div[1]/a/@title")[0]
        href = div.xpath("./tr/td[2]/div[1]/a/@href")[0]
        score=div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0]
        num=div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")").strip()
        scrible=div.xpath("./tr/td[2]/p[2]/span/text()")

        if len(scrible) > 0:
            print("{},{},{},{},{}\n".format(title,href,score,num,scrible[0]))
        else:
            print("{},{},{},{}\n".format(title,href,score,num))






# 打印:

追風箏的人,https://book.douban.com/subject/1770782/,8.9,327193人評價,為你,千千萬萬遍

解憂雜貨店,https://book.douban.com/subject/25862578/,8.6,298891人評價,一碗精心熬制的東野牌雞湯,拒絕很難

小王子,https://book.douban.com/subject/1084336/,9.0,252173人評價,獻給長成了大人的孩子們

 

本文地址github:https://github.com/yizhiamumu/pythonSample


readme.txt

公眾號:一只阿木木

博客園:http://www.cnblogs.com/yizhiamumu/

github:https://github.com/yizhiamumu/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM