js 爬虫抓取网页数据(本文接上文分享:pyspider界面pyspider模拟登录渲染爬取AJAX异步加载网页pyspider)

优采云 发布时间: 2022-04-15 13:40

  js 爬虫抓取网页数据(本文接上文分享:pyspider界面pyspider模拟登录渲染爬取AJAX异步加载网页pyspider)

  这篇文章继续上面的内容,继续聊聊python爬虫的相关知识。上一篇是关于各种爬虫库的。本文主要介绍一个好用的框架pyspider,标题如下:

  pyspider简介Pyspider接口pyspider脚本模拟登录JS渲染爬取AJAX异步加载网页pyspider简介

  Pyspider 是 Binux 制作的爬虫架构的开源实现。主要功能有:

  Pyspider使用去重调度、队列抓取、异常处理、监控等功能作为框架,只需要提供抓取脚本,保证灵活性即可。最后,web的编辑调试环境和web任务的监控成为框架。pyspider的设计基础是:一个python脚本驱动的抓环模型爬虫

  

  pyspider 接口

  在终端输入pyspider all运行pyspider服务,然后在浏览器中输入localhost:5000就可以看到pyspider的界面,rate用来控制每秒爬取的页面数,burst可以看做是并发控制。

  

  点击create创建项目

  

  点击新建项目,打开脚本编辑界面

  

  我们可以在这里编写和调试脚本。网络可以在测试期间显示网页。网页左侧的按钮是css选择器,html是网页的源代码,followers显示可以爬取的url。具体调试,亲身体验就知道了。

  pyspider 脚本

  但是当你创建一个新项目时,你会看到这些默认的脚本模板。接下来简单介绍一下pyspider脚本的编写。

  from pyspider.libs.base_handler import *class Handler(BaseHandler):

crawl_config = {

}

@every(minutes=24 * 60) def on_start(self):

self.crawl('__START_URL__', callback=self.index_page)

@config(age=10 * 24 * 60 * 60) def index_page(self, response): for each in response.doc('a[href^="http"]').items():

self.crawl(each.attr.href, callback=self.detail_page)

@config(priority=2) def detail_page(self, response): return { "url": response.url, "title": response.doc('title').text(),

}

  更多参数用法可以查看官方文档。

  index_page 和 detail_page 只是初始脚本中的回调函数。除了on_start,其他函数名可以自定义@every(minutes=24 * 60)来设置执行频率(24*60是一天一次,所以可以每天执行一次) 爬取一次获取数据) @config 模拟登录

  有很多网站用户需要登录才能浏览更多内容,所以我们的爬虫需要实现模拟登录的功能,我们可以使用selenium来实现模拟登录。

  Selenium 是一个 Web 应用测试的工具,我们也可以通过 selenium 来实现登录功能。以微博为例

  from selenium import webdriver

driver = webdriver.Chrome()

driver.get("https://weibo.com/")

username = driver.find_element_by_css_selector("input#loginname")

username.clear()

username.send_keys('your_username')

password = driver.find_element_by_css_selector('span.enter_psw')

password.clear()

password.send_keys('your_password')

  输入帐号和密码后,最大的问题来了。验证码都是图片。一般我们需要使用图像识别来识别验证码,但是由于验证码的种类很多(英文、数字、中文或者它们的混合),而且验证码也可能会被旋转、扭曲甚至附着在每个其他,以至于人眼不能很好的识别,所以大部分模型的通用性和准确率都不是很高。因此,最有效的方法是在selenium打开浏览器后手动登录(过程中调用time.sleep()暂停程序)。由于爬虫最重要的不是解决登录问题,这样就节省了很多时间和代码,虽然笨但很有用。

  登录后,使用代码获取cookie,并在pyspider全局参数中将cookie_dict传递给cookies。

  cookies_dict = {}

cookies = driver.get_cookies()for cookie in cookies:

cookies_dict[cookie['name']] = cookie['value']

  JS渲染

  普通请求只能爬取静态的HTML页面,但是大部分网站都是混着JS数据加载的,数据是懒加载的。如果要爬取这些内容,可以使用 selenium + PhantomJS 将网页完整渲染,然后再进行网页分析。PhantomJS 是一个非接口、可编写脚本的 WebKit 浏览器引擎。使用方法类似于使用 selenium + Chrome 模拟登录,但由于 PhantomJS 没有接口,内存消耗会少很多。

  爬取 AJAX 以异步加载网页

  AJAX 是一种用于创建快速和动态网页的技术。AJAX 可以通过在后台与服务器交换少量数据来异步更新网页。这意味着可以在不重新加载整个页面的情况下更新页面的某些部分。要爬取AJAX异步加载的网页,我们需要分析网页的请求和返回信息。具体来说,我们需要使用谷歌浏览器的开发者工具(火狐等浏览器也有这个)查看网络的XHR,但是当网页部分更新时,浏览器发出了什么请求,返回了什么通过浏览器。

  在我们微博登录的首页,只要将滚动条移到最下方,就会发现刷新了一条新的微博。这是我们打开开发者工具一直往下滚动,然后你会发现,但是你刷出来的时候有新的信息,总是发出新的请求,返回的json中的数据就是刷新微博的html .

  

  

  

  

  

  仔细观察发现pagebar的变化是有规律的,id减15,对应新刷新的15微博。因此,可以推测pagebar应该是刷新微博的关键。在此之前,我们需要给爬虫添加请求头,否则很可能被服务器识别为机器人,无法成功访问。请求标头也可以在开发者工具中找到。

  def on_start(self): for i in range(10):

url = 'https://weibo.com/aj/mblog/fsearch?pagebar=%s'%i

self.crawl(url, callback=self.index_page)

  发现微博内容被成功抓取并返回。然后只需处理您需要的信息。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线