Python7個爬蟲小案例詳解(附源碼)中篇
本次的7個python爬蟲小案例涉及到瞭re正則、xpath、beautiful soup、selenium等知識點,非常適合剛入門python爬蟲的小夥伴參考學習。
前言
關於Python7個爬蟲小案例的文章分為三篇,本篇為中篇,共兩題,其餘兩篇內容請關註!
題目三:
分別使用XPath和Beautiful Soup4兩種方式爬取並保存非異步加載的“豆瓣某排行榜”如https://movie.douban.com/top250的名稱、描述、評分和評價人數等數據
先分析:
首先,來到豆瓣Top250頁面,首先使用Xpath版本的來抓取數據,先分析下電影列表頁的數據結構,發下都在網頁源代碼中,屬於靜態數據
接著我們找到數據的規律,使用xpath提取每一個電影的鏈接及電影名
然後根據鏈接進入到其詳情頁
分析詳情頁的數據,發現也是靜態數據,繼續使用xpath提取數據
最後我們將爬取的數據進行存儲,這裡用csv文件進行存儲
接著是Beautiful Soup4版的,在這裡,我們直接在電影列表頁使用bs4中的etree進行數據提取
最後,同樣使用csv文件進行數據存儲
源代碼即結果截圖:
XPath版:
import re from time import sleep import requests from lxml import etree import random import csv def main(page,f): url = f'https://movie.douban.com/top250?start={page*25}&filter=' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.35 Safari/537.36',} resp = requests.get(url,headers=headers) tree = etree.HTML(resp.text) # 獲取詳情頁的鏈接列表 href_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/@href') # 獲取電影名稱列表 name_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()') for url,name in zip(href_list,name_list): f.flush() # 刷新文件 try: get_info(url,name) # 獲取詳情頁的信息 except: pass sleep(1 + random.random()) # 休息 print(f'第{i+1}頁爬取完畢') def get_info(url,name): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.35 Safari/537.36', 'Host': 'movie.douban.com', } resp = requests.get(url,headers=headers) html = resp.text tree = etree.HTML(html) # 導演 dir = tree.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')[0] # 電影類型 type_ = re.findall(r'property="v:genre">(.*?)</span>',html) type_ = '/'.join(type_) # 國傢 country = re.findall(r'地區:</span> (.*?)<br',html)[0] # 上映時間 time = tree.xpath('//*[@id="content"]/h1/span[2]/text()')[0] time = time[1:5] # 評分 rate = tree.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/strong/text()')[0] # 評論人數 people = tree.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/div/div[2]/a/span/text()')[0] print(name,dir,type_,country,time,rate,people) # 打印結果 csvwriter.writerow((name,dir,type_,country,time,rate,people)) # 保存到文件中 if __name__ == '__main__': # 創建文件用於保存數據 with open('03-movie-xpath.csv','a',encoding='utf-8',newline='')as f: csvwriter = csv.writer(f) # 寫入表頭標題 csvwriter.writerow(('電影名稱','導演','電影類型','國傢','上映年份','評分','評論人數')) for i in range(10): # 爬取10頁 main(i,f) # 調用主函數 sleep(3 + random.random())
Beautiful Soup4版:
import random import urllib.request from bs4 import BeautifulSoup import codecs from time import sleep def main(url, headers): # 發送請求 page = urllib.request.Request(url, headers=headers) page = urllib.request.urlopen(page) contents = page.read() # 用BeautifulSoup解析網頁 soup = BeautifulSoup(contents, "html.parser") infofile.write("") print('爬取豆瓣電影250: \n') for tag in soup.find_all(attrs={"class": "item"}): # 爬取序號 num = tag.find('em').get_text() print(num) infofile.write(num + "\r\n") # 電影名稱 name = tag.find_all(attrs={"class": "title"}) zwname = name[0].get_text() print('[中文名稱]', zwname) infofile.write("[中文名稱]" + zwname + "\r\n") # 網頁鏈接 url_movie = tag.find(attrs={"class": "hd"}).a urls = url_movie.attrs['href'] print('[網頁鏈接]', urls) infofile.write("[網頁鏈接]" + urls + "\r\n") # 爬取評分和評論數 info = tag.find(attrs={"class": "star"}).get_text() info = info.replace('\n', ' ') info = info.lstrip() print('[評分評論]', info) # 獲取評語 info = tag.find(attrs={"class": "inq"}) if (info): # 避免沒有影評調用get_text()報錯 content = info.get_text() print('[影評]', content) infofile.write(u"[影評]" + content + "\r\n") print('') if __name__ == '__main__': # 存儲文件 infofile = codecs.open("03-movie-bs4.txt", 'a', 'utf-8') # 消息頭 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'} # 翻頁 i = 0 while i < 10: print('頁碼', (i + 1)) num = i * 25 # 每次顯示25部 URL序號按25增加 url = 'https://movie.douban.com/top250?start=' + str(num) + '&filter=' main(url, headers) sleep(5 + random.random()) infofile.write("\r\n\r\n") i = i + 1 infofile.close()
題目四:
實現某東商城某商品評論數據的爬取(評論數據不少於100條,包括評論內容、時間和評分)
先分析:
本次選取的某東官網的一款聯想筆記本電腦,數據為動態加載的,通過開發者工具抓包分析即可。
源代碼及結果截圖:
import requests import csv from time import sleep import random def main(page,f): url = 'https://club.jd.com/comment/productPageComments.action' params = { 'productId': 100011483893, 'score': 0, 'sortType': 5, 'page': page, 'pageSize': 10, 'isShadowSku': 0, 'fold': 1 } headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.35 Safari/537.36', 'referer': 'https://item.jd.com/' } resp = requests.get(url,params=params,headers=headers).json() comments = resp['comments'] for comment in comments: content = comment['content'] content = content.replace('\n','') comment_time = comment['creationTime'] score = comment['score'] print(score,comment_time,content) csvwriter.writerow((score,comment_time,content)) print(f'第{page+1}頁爬取完畢') if __name__ == '__main__': with open('04.csv','a',encoding='utf-8',newline='')as f: csvwriter = csv.writer(f) csvwriter.writerow(('評分','評論時間','評論內容')) for page in range(15): main(page,f) sleep(5+random.random())
到此這篇關於Python7個爬蟲小案例詳解(附源碼)中篇的文章就介紹到這瞭,其他兩個部分的內容(上、下篇)請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python7個爬蟲小案例詳解(附源碼)上篇
- python爬取一組小姐姐圖片實例
- Python xpath,JsonPath,bs4的基本使用
- 利用python實現查看溧陽的攝影圈
- python beautifulsoup4 模塊詳情