Python 爬蟲爬取多頁數據


現在有一個需求,爬取http://www.chinaooc.cn/front/show_index.htm中所有的課程數據。

 

 

 

但是,按照常規的爬取方法是不可行的,因為數據是分頁的:

 

 最關鍵的是,不管是第幾頁,瀏覽器地址欄都是不變的,所以每次爬蟲只能爬取第一頁數據。為了獲取新數據的信息,點擊F12,查看頁面源代碼,可以發現數據是使用JS動態加載的,而且沒有地址,只有一個skipToPage(..)函數。

所以,解決方案是:

  1. 獲得請求信息,包括header和 form data(表單信息)
  2. 模擬請求,獲得數據
  3. 分析數據,獲得結果

以下為實施步驟:

1.獲取請求信息,如下圖所示,控制台選擇Network->XHR,此時,點擊頁面跳轉按鈕,控制台會出現發出的請求,然后選擇發出請求的文件(第三步),然后選擇Headers,下方顯示的就是請求頭文件信息。

 

 

2,使用Python 模擬請求,在Headers下找到 Request Headers 部分,這是請求的頭數據。

 

 然后找到Form Data

 

 復制以上內容,形成如下代碼

headers = {
    'Accept': 'text/html, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,ko;q=0.7',
    
    'Connection': 'keep-alive',
    'Content-Length': '61',
    'Cookie': 'route=bd118df546101f9fcee5c1a58356a008; JSESSIONID=047BD79E9754BAED525EFE860760393E',
    'Host': 'www.chinaooc.cn',
    'Origin': 'http://www.chinaooc.cn',
    'Pragma': 'no-cache',
    'Referer': 'http://www.chinaooc.cn/front/show_index.htm',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
    
    'X-Requested-With': 'XMLHttpRequest',
    'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
    }

    
form_data = {
    'pager.pageNumber':'2',
    'pager.pageSize': '50',
    'pager.keyword': '',
    'mode': 'page'
    }

模擬發送請求,每次改變form_data中的頁碼就能獲得不同的數據,代碼如下:

form_data['pager.pageNumber']=times
url = 'http://www.chinaooc.cn/front/show_index.htm'
response = requests.post(url, data=form_data, headers=headers)

3,分析response中返回的信息即可獲得數據。

 

完整代碼如下:

#!/usr/bin/env python

# -*- coding: utf-8 -*-
import requests
import re
from bs4 import BeautifulSoup

class item:
    def __init__(self):
        self.num=0
        self.school=''
        self.clazz=''
        self.url=''
        
headers
= { 'Accept': 'text/html, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,ko;q=0.7', 'Connection': 'keep-alive', 'Content-Length': '61', 'Cookie': 'route=bd118df546101f9fcee5c1a58356a008; JSESSIONID=047BD79E9754BAED525EFE860760393E', 'Host': 'www.chinaooc.cn', 'Origin': 'http://www.chinaooc.cn', 'Pragma': 'no-cache', 'Referer': 'http://www.chinaooc.cn/front/show_index.htm', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', 'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8' } form_data = { 'pager.pageNumber':'2', 'pager.pageSize': '50', 'pager.keyword': '', 'mode': 'page' } times =20 while times < 34: form_data['pager.pageNumber']=times url = 'http://www.chinaooc.cn/front/show_index.htm' response = requests.post(url, data=form_data, headers=headers) soup = BeautifulSoup(response.content, "html.parser") tr_list = soup.find_all('tr') my_tr_list = tr_list[1:-1] for tr in my_tr_list: td_list = tr.find_all('td') a = item() a.num = td_list[0].contents[0] a.school = td_list[1].contents[0] a.clazz = td_list[2].contents[0].replace('\"',' ') a.url = td_list[5].find_all('a')[0]["href"] #name = with open('E:/data/'+'['+a.num+']['+a.school+']['+a.clazz+'].html','wb') as f: res = requests.get(a.url) res.encoding = res.apparent_encoding f.write(res.content) times= times+1

 

 

 

 

 

 

 

 

 

 


免責聲明!

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



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