完整源代碼:
#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")
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方式來訪問