关于动态web爬虫个人总结

Python爬虫

利用selenium爬取信息并保存到本地
以往的爬虫都是通过请求url后响应的html格式的网页文本,进行解析和处理的,但实际上,请求url返回的信息不仅仅局限在html格式文本,即静态网页,还可返回动态数据,通常情况下,动态数据通常为json格式。
在这里插入图片描述
从浏览器控制台可以看到请求’ https://www.toutiao.com/’链接时,该url返回的信息如下图,因篇幅问题,图片只展示响应内容的一部分。
在这里插入图片描述
分析该响应内容后,可以看到,响应信息里面并没有包含任何今日头条界面展示的热门新闻信息。那么,界面上的数据到底是从哪来的?

实际上,今日头条的该页面返回的是动态数据,返回的页面信息并不包含任何有价值的热门新闻信息,只是界面当前的布局等其他信息。而热门新闻信息的返回实际上是通过下图的接口获得的。
在这里插入图片描述
热门新闻消息实际调用url如下:
https://www.toutiao.com/api/pc/focus/
请求该url获得的响应的部分信息如下:
在这里插入图片描述
可以看到,该响应信息格式为json格式,且响应信息里面的乱码信息实际是中文的Unicode编码格式,现在将该响应信息利用besjon网站实现unicode编码转为utf-8之后,转码后的响应内容如下:
在这里插入图片描述
了解响应的内容为json格式后,下一步就是对返回的数据进行处理和分析,首先,明确为json格式,因此,我们利用python的第三方模块json,将相应数据进行解析。

import requests
import json

url = 'https://www.toutiao.com/api/pc/focus/‘
#获得url响应内容
webdata = requests.get(url).text
#将返回信息转格式化为json格式
data = json.loads(webdata)
#解析获得的返回
news = data[‘data’][‘pc_feed_focus’]#分析data数据,看是否为json格式,后分析数据内容,获取感兴趣的数据

#打印热度较高的新闻信息
for new in news:
    print(new)

代码执行正确情况下,示例代码执行的部分结果如下:
在这里插入图片描述
前面已经讲到了如何利用selenium获得网页内容,下一步要做的即对网页内容进行解析,以获得我们感兴趣的数据信息

from selenium import webdriver
from bs4 import BeautifulSoup

#要访问的网页url
url = "https://news.qq.com/"
#获得浏览器对象
browser = webdriver.Chrome('D:\chromedriver_win32\chromedriver')
#利用浏览器对象打开url对应网页
browser.get(url)
soup = BeautifulSoup(browser.page_source, 'lxml')
news_titles = soup.select("div.text > em.f14 > a.linkto")
for n in news_titles:
    title = n.get_text()
    link = n.get('href')
    data = {'标题':title,'链接':link}
    print(data)

示例代码在正常执行时,结果如下
在这里插入图片描述
在此我们成功爬取了动态的web数据,但如今各大网站也针对爬虫做了一些针对的反爬虫措施,这里我们介绍宁一种爬虫方法

Ajax数据爬取

具体方法:
1.首先是定义自己headers,注意headers里面的User-Agent这一字段可以根据自己需求设计一个列表,用于随机调换。

2.ajax数据的网页特点:NetWork中的XHR网络流中有一些ajax请求,其中它们request_url必定是一个ajax请求接口,并且headers里面的referer是其跳转前的url,在构造自己的headers的时候需要设置referer字段。

3.1 ajax数据的抓取爬虫和普通的网页爬取多了一个url,一个是referer的url,放置于headers中。另外一个就是ajax_url,这个也是主要访问url。

3.2 最重要的一点,ajax一般返回json数据,所以抓取下来的数据解析形式有所不同。直接将结果集转换成json结果集即可,访问方式就是普通字典、列表访问形式。

3.3 另外一个就是访问参数,若请求中带有param,就将其构造。若没有可忽略。
以下为具体代码


from urllib.request import quote,unquote
import random
import requests
 
keyword = quote('java').strip()
print(keyword, type(keyword))
city = quote('南京').strip()
print(unquote(city))
 
refer_url = 'https://www.lagou.com/jobs/list_%s?city=%s&cl=false&fromSearch=true&labelWords=&suginput=' % (keyword, city)
ajax_url = 'https://www.lagou.com/jobs/positionAjax.json?city=%s&needAddtionalResult=false' %city
user_agents=[
    'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299',
]
 
data ={
    'first': 'true',
    'pn': '1',
    'kd': keyword,
}
headers={
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Content-Length': '46',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Host': 'www.lagou.com',
    'Origin': 'https://www.lagou.com',
    'Referer': refer_url,
    'User-Agent': user_agents[random.randrange(0,3)],
    'X-Anit-Forge-Code': '0',
    'X-Anit-Forge-Token': 'None',
    'X-Requested-With': 'XMLHttpRequest',
}
resp = requests.post(ajax_url,data=data, headers=headers)
 
result = resp.json()
print(result)
# print(result)
#result 就是最终获得的json格式数据
item = result['content']['positionResult']['result'][0]
print(item)
#item就是单个招聘条目信息
print("程序结束")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值