爬蟲實踐01 | xpath爬取豆瓣top250電影排行榜
阿新 • • 發佈:2022-03-01
完整原始碼:
#2022-03-01 xpath爬取豆瓣top250電影排行榜 import requests from lxml import etree import time for a in range(10): headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'} #1、指定url url='https://movie.douban.com/top250?start={}&filter='.format(a*25) #2、發起請求 請求對應的url是攜帶引數的,並且請求過程中處理了引數 response = requests.get(url=url,headers=headers) # print(response.text) html=etree.HTML(response.text) divs=html.xpath('//*[@id="content"]/div/div[1]/ol/li')#這個屬性裡面有雙引號,外面就用單引號 #print(divs) #拿到每一個div for div in divs: title=div.xpath('./div/div[2]/div[1]/a/span[1]/text()') [0]#標題 打印出來是一個列表,我們要訪問列表裡的元素,只有一個元素,所以要加一個[0] year=div.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]#年份 pj=div.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0]#評價 href=div.xpath('./div/div[2]/div[1]/a/@href')[0]#連結 print(title,year,pj,href) time.sleep(3) with open(r"dbmovie.txt","a",encoding="utf-8") as f: #使用with open()新建物件f ,a 表示追加 f.write("{},{},{},{}".format(title,year,pj,href))#將列表中的資料迴圈寫入到文字檔案中 f.write("\n")
分析:
1、訪問網站資訊
url=“https://movie.douban.com/top250”
import requests from lxml import etree headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'} #1、指定url url='https://movie.douban.com/top250' #2、發起請求 請求對應的url是攜帶引數的,並且請求過程中處理了引數 response = requests.get(url=url,headers=headers) print(response.text)
2、解析資料,拿到所有div標籤
import requests from lxml import etree headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'} #1、指定url url='https://movie.douban.com/top250' #2、發起請求 請求對應的url是攜帶引數的,並且請求過程中處理了引數 response = requests.get(url=url,headers=headers) # print(response.text) html=etree.HTML(response.text) divs=html.xpath('//*[@id="content"]/div/div[1]/ol/li')#這個屬性裡面有雙引號,外面就用單引號 print(divs)
copy得到的xpath是://*[@id="content"]/div/div[1]/ol/li[1]這個是一個div,要所有的div:
就改成://*[@id="content"]/div/div[1]/ol/li,去掉[1]
3、找到單個div,並查詢所有需要的欄位
import requests from lxml import etree import time headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'} #1、指定url url='https://movie.douban.com/top250' #2、發起請求 請求對應的url是攜帶引數的,並且請求過程中處理了引數 response = requests.get(url=url,headers=headers) # print(response.text) html=etree.HTML(response.text) divs=html.xpath('//*[@id="content"]/div/div[1]/ol/li')#這個屬性裡面有雙引號,外面就用單引號 #print(divs) #拿到每一個div for div in divs: title=div.xpath('./div/div[2]/div[1]/a/span[1]/text()') [0]#標題 打印出來是一個列表,我們要訪問列表裡的元素,只有一個元素,所以要加一個[0] year=div.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]#年份 pj=div.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0]#評價 href=div.xpath('./div/div[2]/div[1]/a/@href')[0]#連結 print(title,year,pj,href) time.sleep(3) with open(r"dbmovie11.txt","a",encoding="utf-8") as f: f.write("{},{},{}".format(title,year,pj,href)) f.write("\n")
其他欄位也是一樣的方法:點選按鈕,在網頁中點選你想查詢的部分,在Elements對應程式碼中點選右鍵,Copy->Copy Xpath,
4、儲存資料
import requests from lxml import etree import time for a in range(10): headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'} #1、指定url url='https://movie.douban.com/top250?start={}&filter='.format(a*25) #2、發起請求 請求對應的url是攜帶引數的,並且請求過程中處理了引數 response = requests.get(url=url,headers=headers) # print(response.text) html=etree.HTML(response.text) divs=html.xpath('//*[@id="content"]/div/div[1]/ol/li')#這個屬性裡面有雙引號,外面就用單引號 #print(divs) #拿到每一個div for div in divs: title=div.xpath('./div/div[2]/div[1]/a/span[1]/text()') [0]#標題 打印出來是一個列表,我們要訪問列表裡的元素,只有一個元素,所以要加一個[0] year=div.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]#年份 pj=div.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0]#評價 href=div.xpath('./div/div[2]/div[1]/a/@href')[0]#連結 print(title,year,pj,href) time.sleep(3) with open(r"dbmovie.txt","a",encoding="utf-8") as f: #使用with open()新建物件f ,a 表示追加 f.write("{},{},{},{}".format(title,year,pj,href))#將列表中的資料迴圈寫入到文字檔案中 f.write("\n")
1、分析網站url可得到,25條資料為一頁,一共10頁,所以用for迴圈來儲存每一頁資料:
url='https://movie.douban.com/top250?start={}&filter='.format(a*25)
2、用with open來開啟一個物件檔案
5、爬取完成
注意:
1、這種最簡單的訪問方式,很容易導致ip被封,請謹慎執行!
(執行3-5次,好像沒啥問題,執行多了,就封了。。。)
2、可以嘗試使用selenium方式來訪問