爬蟲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
公眾號:一只阿木木