2016-06-28 77 views
0

我按照網站併成功得到職位頁面AJAX數據Apple.com充分利用AJAX數據在Python

教學網站:http://toddhayton.com/2015/03/11/scraping-ajax-pages-with-python/

下面是完整的代碼,這是正確的:

import json 
import requests 
from bs4 import BeautifulSoup 

class AppleJobsScraper(object): 
    def __init__(self): 
     self.search_request = { 
      "jobType":"0", 
      "sortBy":"req_open_dt", 
      "sortOrder":"1", 
      "filters":{ 
       "locations":{ 
        "location":[{ 
         "type":"0", 
         "code":"USA" 
        }] 
       } 
      }, 
      "pageNumber":"0" 
     } 
    def scrape(self): 
     jobs = self.scrape_jobs() 
     for job in jobs: 
      #print(job) 
      pass 
    def scrape_jobs(self, max_pages=3): 
     jobs = [] 
     pageno = 0 
     self.search_request['pageNumber'] = pageno 

     while pageno < max_pages: 
      payload = { 
       'searchRequestJson': json.dumps(self.search_request), 
       'clientOffset': '-300' 
      } 

      r = requests.post(
       url='https://jobs.apple.com/us/search/search-result', 
       data=payload, 
       headers={ 
        'X-Requested-With': 'XMLHttpRequest' 
       } 
      ) 

      s = BeautifulSoup(r.text) 
      if not s.requisition: 
       break 

      for r in s.findAll('requisition'): 
       job = {} 
       job['jobid'] = r.jobid.text 
       job['title'] = r.postingtitle and \ 
        r.postingtitle.text or r.retailpostingtitle.text 
       job['location'] = r.location.text 
       jobs.append(job) 

      # Next page 
      pageno += 1 
      self.search_request['pageNumber'] = pageno 

     return jobs 

if __name__ == '__main__': 
    scraper = AppleJobsScraper() 
    scraper.scrape() 

我幾乎瞭解網站提供的代碼,除了一小段之外。

for r in s.findAll('requisition'): 
    job = {} 
    job['jobid'] = r.jobid.text 
    job['title'] = r.postingtitle and \ 
     r.postingtitle.text or r.retailpostingtitle.text 
    job['location'] = r.location.text 
    jobs.append(job) 

我很好奇什麼s.findAll('requisition')手段。

當然,我應該打印出print(s.get_text())的網站文字,看看網站的源代碼是什麼樣的。

但我得到的不像網站代碼,這讓我更加困惑。

所以我想知道爲什麼代碼可以使用s.findAll('requisition')來獲取數據。

爲什麼代碼知道它可以使用job['jobid'],job['title'], job['location']來獲取它想要的數據。

我非常感謝您的幫助!

+1

檢查BeautifulSoup的文檔 - 這是html解析器,所以它解析html並將其拆分成可以被多個參數遍歷的內部結構,這個具體的使用xml標籤名稱 – Jerzyk

+0

@Jerzyk因此'requisition'是XML中的標籤?程序員如何知道他可以使用job ['jobid']','job ['title']','job ['location']'來獲取他想要的數據?我發現沒有線索知道它。 –

+1

您正在從已知源提取數據,因此您應該知道,如果不知道 - 分析服務返回的數據,然後用專用工具對其進行分析([BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/bs4/ doc /)在這個例子中) – Jerzyk

回答

0

在該代碼中,您使用的是Beautiful Soup,它是一個HTML解析器。該工具向您提供findAll方法,該方法將查找文檔上的所有「請購單」標籤。所以,這個方法返回一個包含所有匹配的列表,並且每個列表元素是一個Tag object,並且您可以在docs上閱讀,Tag object是原始文檔中的一個標籤。