动态网页抓取(1.代码实现接下来提取首页jobName中包含python的所有链接)

优采云 发布时间: 2021-10-16 10:00

  动态网页抓取(1.代码实现接下来提取首页jobName中包含python的所有链接)

  根据联合国网站可访问性审计报告,主流网站中73%的重要功能依赖JavaScript。它不适用于单页应用程序的简单表单事件。使用 JavaScript 时,加载后不再立即下载所有页面内容。这将导致许多网页中显示的内容不会出现在 HTML 源代码中。对于这种动态依赖JavaScript,我们需要采用相应的方法,比如JavaScript逆向工程,渲染JavaScript。

  1.动态网页示例

  

  如上图,打开兆联招聘首页,输入python,搜索就会出现上图页面,现在我们抓取上图中红色标记的链接地址

  首先分析网页,获取该位置的div元素信息。我这里用的是firefox浏览器,按F12

  

  看上图,红色标记是我们要获取的链接地址,现在用代码获取链接试试

  import requests

from bs4 import BeautifulSoup as bs

url = 'https://sou.zhaopin.com/?jl=736&kw=python&kt=3'

reponse = requests.get(url)

soup = bs(reponse.text,"lxml")

print(soup.select('span[title="JAVA软件工程师"]'))

print(soup.select('a[class~="contentpile__content__wrapper__item__info"]'))

  输出结果为:[][]

  这意味着这个示例爬虫失败了。查看源码会发现我们抓取的元素其实是空的,但是firefox给我们展示的是网页的当前状态,也就是使用JavaScript动态加载搜索结果后的网页。 .

  2. 逆向工程动态网页

  在firefox中按F12,点击控制台打开XHR

  

  点击一一打开,查看回复内容

  

  你会发现最后一行有我们想要的内容,继续点击结果的index 0

  

  很好,这就是我们要找的信息

  接下来我们可以爬取第三行的网址,得到我们想要的json信息。

  3.代码实现

  接下来,提取首页jobName中所有收录python的链接:

  import requests

import urllib

import http

import json

def format_url(url, start=0,pagesize=60,cityid=736,workEXperience=-1,

education=-1,companyType=-1,employmentType=-1,jobWelfareTag=-1,

kw="python",kt=3):

url = url.format(start,pagesize,cityid,workEXperience,education,companyType,\

employmentType,jobWelfareTag,kw,kt)

return url;

def ParseUrlToHtml(url,headers):

cjar = http.cookiejar.CookieJar()

opener = urllib.request.build_opener(urllib.request.HTTPSHandler, urllib.request.HTTPCookieProcessor(cjar))

headers_list = []

for key,value in headers.items():

headers_list.append(key)

headers_list.append(value)

opener.add_headers = [headers_list]

html = None

try:

urllib.request.install_opener(opener)

request = urllib.request.Request(url)

reponse = opener.open(request)

html = reponse.read().decode('utf-8')

except urllib.error.URLError as e:

if hasattr(e, 'code'):

print ("HTTPErro:", e.code)

elif hasattr(e, 'reason'):

print ("URLErro:", e.reason)

return opener,reponse,html

'''print(ajax)

with open("zlzp.txt", "w") as pf:

pf.write(json.dumps(ajax,indent=4))'''

if __name__ == "__main__":

url = 'https://fe-api.zhaopin.com/c/i/sou?start={}&pageSize={}&cityId={}'\

'&workExperience={}&education={}&companyType={}&employmentType={}'\

'&jobWelfareTag={}&kw={}&kt={}&_v=0.11773497'\

'&x-zp-page-request-id=080667c3cd2a48d79b31528c16a7b0e4-1543371722658-50400'

headers = {"Connection":"keep-alive",

"Accept":"application/json, text/plain, */*",

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0'}

opener,reponse,html = ParseUrlToHtml(format_url(url), headers)

if reponse.code == 200:

try:

ajax = json.loads(html)

except ValueError as e:

print(e)

ajax = None

else:

results = ajax["data"]["results"]

for result in results:

if -1 != result["jobName"].lower().find("python"):

print(result["jobName"],":",result["positionURL"])

  输出:

  

  转载于:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线