ajax数据爬取相关知识
-
P2P平台数据爬取分析关于数据来源 本项目写于2017年七月初,主要使用Python爬取网贷之家以及人人贷的数据进行分析。 网贷之家是国内最大的P2P数据平台,人人贷国内排名前二十的P2P平台。 源码地址 数据爬取 抓包分析 抓包工具主要使用chrome的开发者工具 网络一栏,网贷之家的数据全部是ajax返回json数据,而人人贷既有ajax返回数据也有html页面直接生成数据。 请求实例 从数据中可以看到请求数据的方式(GET或者POST),请求头以及请求参数。 从请求数据中可以看到返回数据的格式(此例中为json)、数据
-
拉勾网职位数据爬取与分析(一)写在前面:开始数据挖掘的学习已有一段时间,由于研究生阶段一直使用C++,代码的熟练度还远远不够,对算法的理解也不够深刻。因此,想要写点东西记录自己学习的过程,希望可以在积累中不断提升自己。今天写一写最近几天爬取分析拉勾网岗位数据的过程,用到了python数据整理常用的pandas库、可视化操作的matplotlib和seaborn库、爬虫算法常用框架scrapy。建立爬虫框架学习scrapy时主要参考了这篇博文:【图文详解】scrapy爬虫与Ajax动态页面——爬取拉勾网职位信息(1)观察拉勾网网页及源代码发现,结构为主页——职位分类——职位列表——具体职位信息,我们尝试爬取“数据挖掘”分类下的所有职位信息,首先建立爬虫框架:spiders文件 观察网页地址发现,数据挖掘分类下第一页职位列表的地址为http://www.lagou.com/zhaopin/shujuwajue/1/?labelWords=label,后面的网页只修改了地址中的数字(即页码),其他不变。class Lgjo
-
爬取电商数据使用webmagic爬取电商评论数据爬取电商数据字体:1.什么是爬虫网络爬虫,也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。网络搜索引擎等站点通过爬虫软件更新自身的网站内容或其对其他网站的索引。网络爬虫可以将自己所访问的页面保存下来,以便搜索引擎事后生成索引供用户搜索。爬虫访问网站的过程会消耗目标系统资源。不少网络系统并不默许爬虫工作。因此在访问大量页面时,爬虫需要考虑到规划、负载,还需要讲“礼貌”。 不愿意被爬虫访问、被爬虫主人知晓的公开站点可以使用robots.txt文件之类的方法避免访问。这个文件可以要求机器人只对网站的一部分进行索引,或完全不作处理。互联网上的页面极多,即使是最大的爬虫系统也无法做出完整的索引。因此在公元2000年之前的万维网出现初期,搜索引擎经常找不到多少相关结果。现在的搜索引擎在这方面已经进步很多,能够即刻给出高质量结果。爬虫还可以验证超链接和HTML代码,用于网络抓取。2.利用爬虫可以做哪些有趣的事1.爬取古诗文 http://s
-
Scrapy抓取Ajax动态页面一般来说爬虫类框架抓取Ajax动态页面都是通过一些第三方的webkit库去手动执行html页面中的js代码, 最后将生产的html代码交给spider分析。本篇文章则是通过浏览器提供的Debug工具分析Ajax页面的具体请求内容,找到获取数据的接口url,直接调用该接口获取数据,省去了引入python-webkit库的麻烦,而且由于一般ajax请求的数据都是结构化数据,这样更省去了我们利用xpath解析html的痛苦。这次我们要抓取的网站是淘女郎的页面,全站都是通过Ajax获取数据然后重新渲染生产的。这篇文章的代码已上传至我的Github,由于后面有部分内容并没有提供完整代码,所以贴上地址供各位参考。分析工作用Chrome打开淘女郎的首页中的美人库,这个页面毫无疑问是会展示所有的模特的信息,同时打开Debug工具,在network选项中查看浏览器发送了哪些请求?2016-07-04_16:11:01.jpg在截图的左下角可以看到总共产生了86个请求,那么有什么办法可以快速定位到Ajax请求的链接了,利用Ne
ajax数据爬取相关课程
ajax数据爬取相关教程
- 3. 爬虫抓取原理 爬虫爬取的数据其实就是网页上面的内容,我们需要通过特定的工具对网页进行分析,比如说 Beautiful Soup。然后提取出 HTML 中的特定标签下的数据。然后,将数据进行持久化保存,方便日后的数据的分析。简单点讲,我们使用爬虫,最根本的目的是爬取网页中对我们有价值的信息和数据。所以,我们大部分爬取的工作,都是在筛选我们有用的信息,并剔除掉无用的信息。这就是爬虫核心所在。
- 3.2 爬取客户端渲染的网页 在互联网早期,网站的内容都是一些简单的、静态的页面,服务器后端生成网页内容,然后返回给浏览器,浏览器获取 html 文件之后就可以直接解析展示了,这种生成 HTML 文件的方式被称为服务器端渲染。而随着前端页面的复杂性提高,出现了基于 ajax 技术的前后端分离的开发模式,即后端不提供完整的 html 页面,而是提供一些 api 返回 json 格式的数据,前端调用后端的 API 获取 json 数据,在前端进行 html 页面的拼接,最后后展示在浏览器上,这种生成 HTML 文件的方式被称为客户端渲染。简单的使用 requests 库无法爬取客户端渲染的页面:requests 爬下来的页面内容并不包含真正的数据只能通过调用后端的 API 才能获取页面的数据有两种方式爬取客户端渲染的网页:分析网页的调用后端 API 的接口这种方法需要分析网站的 JavaScript 逻辑,找到调用后端 API 的的代码,分析 API 的相关参数。分析后再用爬虫模拟模拟调用后端 API,从而获取真正的数据。很多情况下,后端 API 的接口接口带着加密参数,有可能花很长时间也无法破解,从而无法调用后端 API。用模拟浏览器的方式来爬取数据在无法解析后端 API 的调用方式的情况下,有一种简单粗暴的方法:直接用模拟浏览器的方式来爬取,比如用 Selenium、Splash 等库模拟浏览器浏览网页,这样爬取到的网页内容包含有真实的数据。这种方法绕过分析 JavaScript 代码逻辑的过程,大大降低了难度。
- 3. 运行 Scrapy 项目,爬取数据 运行这个 scrapy 爬虫的命令如下:(scrapy-test) [root@server scrapy-test]# scrapy crawl China-Pub-Crawler# 开始源源不断的爬取数据# ...下面来看我们的视频演示效果:79通过今天的一个简单小项目,大家对 Scrapy 框架是否有了初步的印象?后面我们会仔细剖析 Scrapy 框架的各个模块以及实现原理,让大家真正理解和掌握 Scrapy 框架。
- Scrapy 抓取今日头条:抓取每日热点新闻 今天我们来基于 Scrapy 框架完成一个新闻数据抓取爬虫,本小节中我们将进一步学习 Scrapy 框架的,来抓取异步 ajax 请求的数据,同时学习 Scrapy 的日志配置、邮件发送等功能。
- 3.1 基本的爬取技术 在互联网早期,网站的内容以静态的 HTML 文件为主,不带任何反爬虫措施。比如,要爬取某个博客站点的全部文章,首先获取网站的首页,就顺着首页的链接爬到文章页,再把文章的时间、作者、正文等信息保存下来。使用 Python 的 requests 库就可以爬取由静态网页构成的网站:使用 requests 库下载指定 URL 的网页使用 XPath、BeautifulSoup 或者 PyQuery 对下载的 HTML 文件进行解析获取 HTML 文件中特定的字段,例如文章的时间、标题等信息,将它们保存获取 HTML 文件中包含的链接,并顺着链接爬取内容爬取到数据后,可以使用 MySQL、MongoDB 等来保存数据,实现持久化存储,同时方便以后的查询操作
- 2. Scrapy 与 Selenium 结合爬取京东图书数据 接下来我们对上面的代码进行调整和 Scrapy 框架结合,而第一步需要做的就是建立好相应的工程:# 创建爬虫项目PS D:\shencong\scrapy-lessons\code\chap17> scrapy startproject jdbooks# ...# 进入到spider目录,使用genspider命令创建爬虫文件PS D:\shencong\scrapy-lessons\code\chap17\jd_books\jd_books\spiders> scrapy genspider jd www.jd.com创建好工程后就是编写 items.py 中的 JdBooksItem 类,这非常简单,直接根据我们前面定义好的字段编写相应的代码即可:class JdBooksItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() book_name = scrapy.Field() price = scrapy.Field() comments = scrapy.Field() shop_name = scrapy.Field() book_detail_url = scrapy.Field()整个项目的难点是如何实现下一页数据的爬取?前面可以使用 selenium 去自动点击页号而进入下一个,然而在 Scrapy 中却不太好这样处理。我们通过分析京东搜索的 URL 后发现,其搜索的 URL 可以简化为如下形式:https://search.jd.com/Search?keyword=搜索关键字&page=(页号* 2 - 1),我们只需要提供搜索的关键字以及相应的请求页号即可。例如下图所示:京东搜索 URL 参数因此我们在 settings.py 中准备两个参数:一个是搜索的关键字,另一个是爬取的最大页数。具体的形式如下:# settings.py# ...KEYWORD = "网络爬虫"MAX_PAGE = 10紧接着我们可以构造出请求不同页的 URL 并交给 Scrapy 的引擎和调度器去处理,对应的 Spider 代码如下:# 代码位置:jd_books/jd_books/spiders/jd.pyfrom urllib.parse import quotefrom scrapy import Spider, Requestfrom jd_books.items import JdBooksItemclass JdSpider(Spider): name = 'jd' allowed_domains = ['www.jd.com'] start_urls = ['http://www.jd.com/'] base_url = "https://search.jd.com/Search?keyword={}&page={}" def start_requests(self): keyword = self.settings.get('KEYWORD', "Python") for page in range(1, self.settings.get('MAX_PAGE') + 1): url = self.base_url.format(quote(keyword), page * 2 - 1) yield Request(url=url, callback=self.parse_books, dont_filter=True) def parse_books(self, response): goods_list = response.xpath('//div[@id="J_goodsList"]/ul/li') print('本页获取图书数目:{}'.format(len(goods_list))) for good in goods_list: book_name_em = good.xpath('.//div[@class="p-name"]/a/em/text()').extract()[0] book_name_font = good.xpath('.//div[@class="p-name"]/a/em/font/text()').extract() book_name_font = "".join(book_name_font) if book_name_font else "" book_name = f"{book_name_em}{book_name_font}" book_detail_url = good.xpath('.//div[@class="p-name"]/a/@href').extract()[0] price = good.xpath('.//div[@class="p-price"]/strong/i/text()').extract()[0] comments = good.xpath('.//div[@class="p-commit"]/strong/a/text()').extract()[0] shop_name = good.xpath('.//div[@class="p-shopnum"]/a/text()').extract()[0] item = JdBooksItem() item['book_name'] = book_name item['book_detail_url'] = book_detail_url item['price'] = price item['comments'] = comments item['shop_name'] = shop_name yield item上面的代码就是单纯的生成多页的 Request 请求 (start_requests() 方法) 和解析网页数据 (parse_books() 方法)。这个解析数据完全依赖于我们获取完整的页面源码,那么如何在 Scrapy 中使用 selenium 去请求 URL 然后获取页面源码呢?答案就是下载中间件。我们在编写一个下载中间件,拦截发送的 request 请求,对于请求京东图书数据的请求我们会切换成 selenium 的方式去获取网页源码,然后将得到的页面源码封装成 Response 响应并返回。在生成 Scrapy 项目中已经为我们准备好了一个 middleware.py 文件,我们按照上面的思路来完成相应代码,具体内容如下:import timefrom scrapy import signalsfrom scrapy.http.response.html import HtmlResponsefrom selenium import webdriverfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.common.by import By# useful for handling different item types with a single interfacefrom itemadapter import is_item, ItemAdapteroptions = webdriver.ChromeOptions()# 注意,使用这个参数我们就不会看到启动的google浏览器,无界面运行options.add_argument('-headless')options.add_experimental_option("excludeSwitches", ['enable-automation'])class JdBooksSpiderMiddleware: # 保持不变 # ... class JdBooksDownloaderMiddleware: # Not all methods need to be defined. If a method is not defined, # scrapy acts as if the downloader middleware does not modify the # passed objects. def __init__(self): self.driver = webdriver.Chrome(options=options, executable_path="C:/Users/Administrator/AppData/Local/Google/Chrome/Application/chromedriver.exe") # ... def process_request(self, request, spider): # Called for each request that goes through the downloader # middleware. # Must either: # - return None: continue processing this request # - or return a Response object # - or return a Request object # - or raise IgnoreRequest: process_exception() methods of # installed downloader middleware will be called print('使用 selenium 请求页面:{}'.format(request.url)) if request.url.startswith("https://search.jd.com/Search"): # 如果是获取京东图书数据的请求,使用selenium方式获取页面 self.driver.get(request.url) time.sleep(2) # 将滚动条拖到最底端,获取一页完整的60条数据 height = self.driver.execute_script("return document.body.scrollHeight;") self.driver.execute_script(f"window.scrollBy(0, {height})") time.sleep(2) # 将最后渲染得到的页面源码作为响应返回 return HtmlResponse(url=request.url, body=self.driver.page_source, request=request, encoding='utf-8', status=200) # ...紧接着,我们需要将这个下载中间件在 settings.py 中启用:DOWNLOADER_MIDDLEWARES = { 'jd_books.middlewares.JdBooksDownloaderMiddleware': 543,}最后我们来完成下数据的存储,继续使用 mongodb 来保存抓取到的数据。从实际测试中发现京东的搜索结果在100页中肯定会有不少重复的数据。因此我们的 item pipelines 需要完成2个处理,分别是去重和保存。来直接看代码:import pymongofrom scrapy.exceptions import DropItemfrom itemadapter import ItemAdapterclass JdBooksPipeline: def open_spider(self, spider): self.client = pymongo.MongoClient(host='47.115.61.209', port=27017) self.client.admin.authenticate("admin", "shencong1992") db = self.client.scrapy_manual self.collection = db.jd_books def process_item(self, item, spider): try: book_info = { 'book_name': item['book_name'], 'comments': item['comments'], 'book_detail_url': item['book_detail_url'], 'shop_name': item['shop_name'], 'price': item['price'], } self.collection.insert_one(book_info) except Exception as e: print("插入数据异常:{}".format(str(e))) return item def close_spider(self, spider): self.client.close()class DuplicatePipeline: """ 去除重复的数据,重复数据直接抛出异常,不会进入下一个流水线处理 """ def __init__(self): self.book_url_set = set() def process_item(self, item, spider): if item['book_detail_url'] in self.book_url_set: print('重复搜索结果:book={}, url={}'.format(item['book_name'], item['book_detail_url'])) raise DropItem('duplicate book info, drop it') self.book_url_set.add(item['book_detail_url']) return item我们直接使用 Item 的 book_detail_url 字段来判断数据是否重复。此外,同样需要将这两个 Item Pipelines 在 settings.py 中启用,且保证 DuplicatePipeline 需要先于 JdBooksPipeline 处理:ITEM_PIPELINES = { 'jd_books.pipelines.DuplicatePipeline': 200, 'jd_books.pipelines.JdBooksPipeline': 300,}最后剩下一步就是禁止遵守 Robot 协议:ROBOTSTXT_OBEY = True至此,我们的 Scrapy 和 Selenium 结合爬取京东图书数据的项目就算完成了。为了快速演示效果,我们将最大请求页设置为10,然后运行代码看看实际的爬取效果:107
ajax数据爬取相关搜索
-
ajax
android
a href
abap
abap开发
abort
absolutelayout
abstractmethoderror
abstracttablemodel
accept
access
access教程
accordion
accumulate
acess
action
actionform
actionlistener
activity
addeventlistener