【问题标题】:scraping javascript:void(0) content using python使用 python 抓取 javascript:void(0) 内容
【发布时间】:2018-07-31 00:31:01
【问题描述】:

我正在制作一个程序,其中我正在报废一个网页,内容从原始页面隐藏并用于显示自身使用 herf = javascript:void(0) 链接,文本位于<p><span> 标记中。

这是我的代码:

import requests, re
from bs4 import BeautifulSoup

page = requests.get('https://www.naukri.com/job-listings-Python-Developer- 
Cloud-Analogy-Softech-Pvt-Ltd-Noida-Sector-63-Noida-1-to-2-years- 
250718003152?src=rcntSrchWithoutCount&sid=15327965116011&xp=1&px=1&qp=python%20developer&srcP%
20ge=s').text
soup = BeautifulSoup(page, 'html.parser')
link = soup.find('div', {'class':'jDisc 
viewContact'}).find_all(re.compile('p|em|span'))
results = [i.text for i in link]
print(results)

HTML 页面在这里:

<a href="javascript:void(0)" class="mt30 dspB f14 lH20"
id="viewCont_trg">View Contact Details</a>

点击链接“查看联系方式”后会显示所有隐藏的内容。你能帮我解决这个问题吗?

【问题讨论】:

  • 执行此操作的唯一方法是执行处理点击事件的 Javascript - 您不会使用常规 GET 请求来执行此操作。
  • 那我该怎么做呢?
  • 其实我不会怎么用selenium!

标签: javascript python web-scraping


【解决方案1】:

隐藏的内容实际上是通过单独的 AJAX 调用获取的:

https://www.naukri.com/jd/contactDetails?file=250718003152

返回一个易于解析的 JSON 字符串:

{
  "hiddenFields": {
    "file": "250718003152",
    "showSendQuery": 1
  },
  "fields": {
    "Recruiter Name": "Malika Pathak, Himani Adhikari",
    "Contact Company": "Cloud Analogy Softech Pvt Ltd",
    "Address": "H-77, H Block, Sector 63, Noida, UP-201307NOIDA,Uttar Pradesh,India 201307",
    "Email Address": {
      "title": "himani.adhikari@cloudanalogy.com , malika.pathak@cloudanalogy.com",
      "src": ""
    },
    "Website": "http:\/\/cloudanalogy.com\/",
    "Telephone": "9319155392"
  },
  "sendQueryForm": {
    "formKey": "F53b54d385c47b",
    "extensions": [
      "doc",
      "docx",
      "pdf",
      "rtf"
    ],
    "max_file_size": "2097152",
    "max_num_files": "1",
    "fileKey": "Ue2777e04d3b690ecbc77607eb919c00",
    "fileKeys": [
      "Ue2777e04d3b690ecbc77607eb919c00"
    ],
    "upload_url": "\/\/files.naukri.com\/0\/saveFile.php",
    "file_url": "\/\/files.naukri.com\/0\/saveUrlFile.php",
    "delete_url": "\/\/files.naukri.com\/0\/deleteFile.php",
    "html": "    \u003Cform id=\"saQ_form\" name=\"sendQ\" action=\"https:\/\/my.naukri.com\/mynaukri\/sendquery.php\/SendQuery\/sendQuery\" method=\"post\" class=\"loginLay\"\u003E\u003Ch3 class=\"title\"\u003ESend a Query to Recruiter\u003C\/h3\u003E\u003Cdiv class=\"row\"\u003E\u003Cdiv class=\"rowL\"\u003E\u003Clabel for=\"eLogin\"\u003EEnter Email ID\u003C\/label\u003E\u003C\/div\u003E\u003Cdiv class=\"rowR\"\u003E\u003Cinput id=\"saQEmail\" name=\"from\" rel=\"required:1005,custom:1001\" type=\"text\" name=\"from\" placeholder=\"Enter your active Email ID\"\u003E\u003Ci class=\"erLbl\" id=\"saQEmail_err\"\u003E\u003C\/i\u003E\u003C\/div\u003E\u003C\/div\u003E\u003Cdiv class=\"row\"\u003E\u003Cdiv class=\"rowL\"\u003E\u003Clabel for=\"pLogin\"\u003EQuery\u003C\/label\u003E\u003C\/div\u003E\u003Cdiv class=\"rowR\"\u003E\u003Ctextarea placeholder=\"Query cannot exceed 500 characters\" id=\"saQ_query\" rel=\"required:1011\" minlength=\"6\" maxlength=\"500\" name=\"query\" onpaste=\"return false\" oncopy=\"return false\"\u003E\u003C\/textarea\u003E\u003Ci class=\"erLbl\" id=\"saQ_query_err\"\u003E\u003C\/i\u003E\u003C\/div\u003E\u003C\/div\u003E\u003Cdiv class=\"row upload\"\u003E\u003Cdiv class=\"rowL\"\u003E\u003Clabel for=\"eLogin\"\u003EAttach Resume \u003Cspan\u003E(optional)\u003C\/span\u003E\u003C\/label\u003E\u003C\/div\u003E\u003Cdiv class=\"rowR\"\u003E\u003Cdiv id=\"hid_container\" style=\"display:none\"\u003E\u003C\/div\u003E\u003Cdiv id=\"saQ_uploadCont\"\u003E\u003Cdiv id=\"saQ_basicProgressBar\" style=\"display:none\"\u003E\u003C\/div\u003E\u003Cinput name=\"F53b54d385c47b[Ue2777e04d3b690ecbc77607eb919c00]\" id=\"saQ_upload\" type=\"file\"\u003E\u003Cul id=\"results\" class=\"outputCss\" style=\"display:none\"\u003E\u003C\/ul\u003E\u003Cp class=\"supDocs\"\u003ESupported Formats: doc, docx, rtf, pdf Max file size: 2MB\u003C\/p\u003E\u003C\/div\u003E\u003Ci class=\"erLbl\" id=\"saQ_upload_err\"\u003E\u003C\/i\u003E\u003Cp href=\"#\" class=\"chk\"\u003E\u003Cem\u003E\u003C\/em\u003E\u003Cspan\u003ESend me jobs like this\u003C\/span\u003E\u003C\/p\u003E\u003Cp href=\"#\" class=\"chk\"\u003E\u003Cspan\u003EI have read and understood and agree to the \u003Ca target=\"_blank\" href=\"https:\/\/www.naukri.com\/termsconditions#g1\"\u003E\"Terms and Conditions\"\u003C\/a\u003E governing the use of naukri.com.\u003C\/span\u003E\u003C\/p\u003E\u003Cbutton type=\"submit\" id=\"saQBtn\" class=\"blueBtn\" name=\"sbt\"\u003ESubmit\u003C\/button\u003E\u003C\/div\u003E\u003C\/div\u003E\u003Cinput type=\"hidden\" value=\"250718003152\" name=\"job_id\"\/\u003E\u003Cinput type=\"hidden\" value=\"1\" name=\"isSMJLT\" id=\"isSMJLT\"\/\u003E\u003Cinput type=\"hidden\" id=\"file_url\" name=\"file_url\"\/\u003E\u003Cinput type=\"hidden\" id=\"file_name\" name=\"file_name\"\/\u003E\u003C\/form\u003E"
  }
}

换句话说,您所要做的就是使用您在主 URL 中已有的 ID(在本例中为 250718003152)向上述 URL 发出单独的 GET 请求,并解析返回的 JSON 对象。

【讨论】:

    【解决方案2】:

    页面加载时,网页上没有联系方式。点击查看联系方式后,网页会发出新请求以获取联系方式。

    为了找出从哪个 url 获取联系信息,您可以打开 firefox 或 chrome 并使用右键单击 > 检查元素(或直接按 f12)打开调试器。然后转到网络选项卡。点击“查看联系方式”,看看它提出了什么要求。我已经检查过了,它获取详细信息的网址是“https://www.naukri.com/jd/contactDetails?file=250718003152”。您可以从原始 url "https://www.naukri.com/job-listings-Python-Developer- 获取文件 ID 为 250718003152 Cloud-Analogy-Softech-Pvt-Ltd-Noida-Sector-63-Noida-1-to-2-years- 250718003152?src=rcntSrchWithoutCount&sid=15327965116011&xp=1&px=1&qp=python%20developer&srcP% 20ge=s"。

    所以您所要做的就是使用 urllib 或您正在使用的任何东西向 url "https://www.naukri.com/jd/contactDetails?file=250718003152" 发出新的获取请求。响应将采用 json 格式。您必须解析 json 并提取所需的字段。

    【讨论】:

      猜你喜欢
      • 2021-05-07
      • 2019-12-28
      • 2011-02-14
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 2016-03-20
      相关资源
      最近更新 更多