1. 程式人生 > 其它 >爬蟲實踐01 | xpath爬取豆瓣top250電影排行榜

爬蟲實踐01 | xpath爬取豆瓣top250電影排行榜

完整原始碼:

#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方式來訪問