爬蟲實踐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方式來訪問

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM