2016-06-28 43 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是原始文档中的一个标签。