精华内容
下载资源
问答
  • 网页数据抓取工具 (谷歌插件 web Scraper)

    万次阅读 多人点赞 2019-01-04 17:42:34
    最简单的数据抓取教程,人人都用得上 Web Scraper 是一款免费的,适用于普通用户(不需要专业 IT 技术的)的爬虫工具,可以方便的通过鼠标和简单配置获取你所想要数据。例如知乎回答列表、微博热门、微博评论、...

    最简单的数据抓取教程,人人都用得上

    Web Scraper 是一款免费的,适用于普通用户(不需要专业 IT 技术的)的爬虫工具,可以方便的通过鼠标和简单配置获取你所想要数据。例如知乎回答列表、微博热门、微博评论、电商网站商品信息、博客文章列表等等。

    安装过程

    • 在线安装方式

    在线安装需要具有可FQ网络,可访问 Chrome 应用商店

    1、在线访问 web Scraper 插件 ,点击 “添加至 CHROME”。

    1.png

    2、然后点击弹出框中的“添加扩展程序”

    2.png

    3、安装完成后在顶部工具栏显示 Web Scraper 的图标。

    3.png

    • 本地安装方式

     

    1、打开 Chrome,在地址栏输入 chrome://extensions/ ,进入扩展程序管理界面,然后将下载好的扩展插件 Web-Scraper_v0.3.7.crx 拖拽到此页面,点击“添加到扩展程序”即可完成安装。如图:

    4.gif

    2、安装完成后在顶部工具栏显示 Web Scraper 的图标。

    3.png

    初识 web scraper

    打开 Web Scraper

    开发人员可以路过看后面了

    windows 系统下可以使用快捷键 F12,有的型号的笔记本需要按 Fn+F12;

    Mac 系统下可以使用快捷键 command+option+i ;

    也可以直接在 Chrome 界面上操作,点击设置—>更多工具—>开发者工具

    5.png

    打开后的效果如下,其中绿色框部分是开发者工具的完整界面,红色框部分是 Web Scraper 区域,也就是我们之后要操作的部分。

    6.png

    注意:如果打开开发者工具在浏览器的右侧区域,则需要调节开发者工具位置到浏览器底部。

    7.gif

    原理及功能说明

    数据爬取的思路一般可以简单概括如下:

    1、通过一个或多个入口地址,获取初始数据。例如一个文章列表页,或者具有某种规则的页面,例如带有分页的列表页;

    2、根据入口页面的某些信息,例如链接指向,进入下一级页面,获取必要信息;

    3、根据上一级的链接继续进入下一层,获取必要信息(此步骤可以无限循环下去);

    原理大致如此,接下来正式认识一下 Web Scraper 这个工具,来,打开开发者工具,点到 Web Scraper 这个标签栏,看到分为三个部分:

    8.png

    Create new sitemap:首先理解 sitemap ,字面意思网站地图,这里可以理解为一个入口地址,可以理解为其对应一个网站,对应一个需求,假设要获取知乎上的一个问题的回答,就创建一个 sitemap ,并将这个问题所在的地址设置为sitemap 的 Start URL,然后点击 “Create Sitemap”即可创建一个 sitemap。

    9.png

    Sitemaps:sitemap 的集合,所有创建过的 sitemap 都会在这里显示,并且可以在这里进入一个 sitemap 进行修改和数据抓取等操作。

    10.png

    Sitemap:进入某个 sitemap ,可以进行一系列的操作,如下图:

    11.png

    其中红色框部分 Add new selector 是必不可少的步骤。selector 是什么呢,字面意思:选择器,一个选择器对应网页上的一部分区域,也就是包含我们要收集的数据的部分。

    需要解释一下,一个 sitemap 下可以有多个 selector,每个 selector 有可以包含子 selector ,一个 selector 可以只对应一个标题,也可以对应一整个区域,此区域可能包含标题、副标题、作者信息、内容等等信息。

    Selectors:查看所有的选择器。

    Selector graph:查看当前 sitemap 的拓扑结构图,根节点是什么,包含几个选择器,选择器下包含的子选择器。

    Edit metadata:可以修改 sitemap 信息,标题和起始地址。

    Scrape:开始数据抓取工作。

    Export data as CSV:将抓取的数据以 CSV 格式导出。

    到这里,有一个简单的认识就可以了,实践出真知,具体的操作案例才具有说服力,下面就以几个例子来说一说具体的用法。

    案例实践

    简单试水 hao123

    由浅入深,先以一个最简单的例子为入口,只是作为进一步认识 Web Scraper 服务

    需求背景:看到下面 hao123 页面中红色框住的部分了吧,我们的需求就是统计这部分区域中的所有网站名称和链接地址,最后以生成到 Excel 中。 因为这部分内容足够简单,当然真正的需求可能比这复杂,这么几个数据手工统计的时间也很快。

    12.png

    开始操作

    1、假设我们已经打开了 hao123 页面,并且在此页面的底部打开了开发者工具,并且定位到了 Web Scraper 标签栏;

    2、点击“Create Sitemap”;

    13.png

    3、之后输入 sitemap 名称和 start url,名称只为方便我们标记,就命名为hao123(注意,不支持中文),start url 就是hao123的网址,然后点击 create sitemap;

    14.png

    4、之后 Web Scraper 自动定位到这个 sitemap,接下来我们添加一个选择器,点击“add new selector”;

    15.png

    5、首先给这个 selector 指定一个 id,就是一个便于识别 名字而已,我这里命名为 hot。因为要获取名称和链接,所以将Type 设置为 Link,这个类型就是专门为网页链接准备的,选择 Link 类型后,会自动提取名称和链接两个属性;

    16.png

    6、之后点击 select ,然后我们在网页上移动光标,会发现光标所到之处会有颜色变化,变成绿色的,表示就是我么当前选择的区域。我们将光标定位到需求里说的那一栏的某个链接处,例如第一个头条新闻,在此处单击,这个部分就会变成红色,说明已经选中了,我们的目的是要选多个,所以选中这个之后,继续选第二个,我们会发现,这一行的链接都变成了红色,没错,这就是我们要的效果。然后点击"Done selecting!"(data preview是选中元素的标识符,可手动修改,通过class 、元素名称来确定元素 如:div.p_name a),最后别忘了勾选 Multiple ,表示要采集多条数据;

    17.png

    7、最后保存,save selector。点击Element preview 可以预览选择的区域,点击 Data preview 可以在浏览器里预览抓取的数据。 后面的文本框里的内容,对于懂技术的同学来说很清楚,这就是 xpath,我们可以不通过鼠标操作,直接手写 xpath 也可以;

    完整操作过程如下:

    18.gif

    8、上一步操作完,其实就可以导出了。先别急,看一下其他的操作,Sitemap hao123 下的 Selector graph,可以看出拓扑结构图,_root 是根 selector ,创建一个 sitemap 自动会有一个 _root 节点,可以看到它的子 selector,就是我们创建的 hot selector;

    19.png

    9、Scrape ,开始抓取数据。

    10、Sitemap hao123 下的 Browse ,可以通过浏览器直接查看抓取的最后结果,需要再;

    20.png

    11、最后,使用 Export data as CSV,以 CSV 格式导出,其中 hot 列是标题,hot-href 列是链接;

    21.png

    怎么样,赶紧试一下吧

    抓取知乎问题所有回答

    简单的介绍完了,接下来试一个有些难度的,抓取一个知乎问题的所有答案,包括回答者昵称、赞同数量、回答内容。问题:为什么鲜有炫富的程序员?

    知乎的特点是,页面向下滚动才会加载后面的回答

    1、首先还是在 Chrome 中打开这个链接,链接地址为:https://www.zhihu.com/question/30692237,并调出开发者工具,定位到 Web Scraper 标签栏;

    2、Create new sitemap,填写 sitemap name 和 start url;

    22.png

    3、接下来,开始添加选择器,点击 Add new selector;

    4、先来分析一下知乎问题的结构,如图,一个问题由多个这种区域组成,一个区域就是一个回答,这个回答区域包括了昵称、赞同数、回答内容和发布时间等。红色框住的部分就是我们要抓取的内容。所以我们抓取数据的逻辑是这样的:由入口页进入,获取当前页面已加载的回答,找到一个回答区域,提取里面的昵称、赞同数、回答内容,之后依次向下执行,当已加载的区域获取完成,模拟向下滚动鼠标,加载后续的部分,一直循环往复,直到全部加载完毕;

    23.png

    5、内容结构的拓扑图如下,_root 根节点下包含若干个回答区域,每个区域下包含昵称、赞同数、回答内容;

    24.png

    6、按照上面这个拓扑图,开始来创建选择器,填写 selector id 为 answer(随意填),Type 选择 Element scroll down 。解释一下:Element 就是针对这种大范围区域的,这个区域还要包含子元素,回答区域就对应 Element,因为要从这个区域获取我们所需的数据,而 Element scroll down 是说这个区域利用向下滚动的方式可以加载更多出来,就是针对这种下拉加载的情况专门设计的。

    25.png

    7、接下来点击 Select,然后鼠标到页面上来,让当绿色框框住一个回答区域后点击鼠标,然后移动到下一个回答,同样当绿色框框住一个回答区域后点击鼠标。这时,除了这两个回答外,所有的回答区域都变成了红色框,然后点击"Done selecting!”,最后别忘了选择 Multiple ,之后保存;

    26.gif

    8、接下来,单击红色区域,进入刚刚创建的 answer 选择器中,创建子选择器;

    27.png

    9、创建昵称选择器,设置 id 为 name,Type 设置为 Text,Select 选择昵称部分,如果没经验的话,可能第一次选的不准,发现有错误,可以调整,保存即可;

    28.gif

    10、创建赞同数选择器;

    29.gif

    11、创建内容选择器,由于内容是带有格式的并且较长,所以有个技巧,从下面选择会比较方便;

    30.gif

    12、执行 Scrape 操作,由于内容较多,可能需要几分钟的时间,如果是为了做测试,可以找一个回答数较少的问题做测试。

    31.png

    展开全文
  • 数据抓取数据抓取流程

    千次阅读 2015-11-30 09:16:35
    公司的数据抓取系统也写了一阵子了,是时候总结下了,不然凭我的记性,过一段时间就忘的差不多了。打算写一个系列将其中踩过的坑都记录下来。暂时定一个目录,按照这个系列来写: 数据抓取流程,以公示网四川为例子...

    公司的数据抓取系统也写了一阵子了,是时候总结下了,不然凭我的记性,过一段时间就忘的差不多了。打算写一个系列将其中踩过的坑都记录下来。暂时定一个目录,按照这个系列来写:

    • 数据抓取流程,以公示网四川为例子,介绍整个数据抓取工作的流程
    • 反爬虫规则:验证码识别,介绍easyocr和uuwise的使用点击查看
    • 反爬虫规则:使用代理,和模拟浏览器头信息访问点击查看

    今天就先来说下数据抓取的大致工作流程.

    先说下背景,公司是做企业征信服务的。整合各方面的数据来制作企业信用报告。主要数据来源,包括:从第三方购买(整体购买数据或者接口形式);抓取网络公开的数据。那么需要一个数据采集平台,以便可以方便,快速的增加新的数据对象进行采集。针对数据抓取平台的架构设计,我也是新手,以后一边学习一边总结这方面经验教训。这个系列先从实战出发,那么第一弹:数据抓取的整个流程。

    我日常做数据抓取分为以下几个步骤:

    • 明确数据采集需求;
    • 分析要采集数据的url和相关参数;
    • 编码。

    咳咳…先不要扔鸡蛋,我知道有人觉得这三个步骤是我拿出来逗逼的。但是,听我说完先。## 明确数据采集需求 先分享一个场景:

    - 产品经理:小张帅哥,我发现这个网站里面的数据对我们非常有用,你给抓取下来吧。
    - 小张:好啊,你要抓取那些数据呢
    - 产品经理:就这个页面的数据都要,这里的基本信息,这里的股东信息
    - 小张:呃,都要是吧,好
    - 产品经理:这个做好要多久啊,
    - 小张:应该不会太久,这些都是表格数据,好解析
    - 产品经理:好的,小张加油哦,做好了请你吃糖哦。
    - 然后小张开始写,写了一会儿小张脸上冒汗了:这怎么基本信息和其他信息还不是一个页面。这表格竟然是在后台画好的,通过js请求数据画在页面的,我去,不同省份的企业表面看着一样,其实标签不一样。这要一个一个省份去适配啊啊啊啊啊啊.
    - 小张同志开始加班加点,可还是没有按照和产平经理约定的时间完成任务
    

    那么问题来了,为什么小张在苦逼的加班加点还没有完成任务。是因为产品经理没有把需求说清楚么?但是产品经理也说了,这个页面的都要啊。问题在于:

    • 1,产品经理说都要的时候,小张应该从技术的角度把那个要抓取的页面的“全部数据”了解清楚,因为产品经理的说的“全部数据”也许只是他看到的那些“全部”,产品经理看到的数据也许是a,b,c,而如果通过自己查看页面,也许还有隐藏的数据d,e,f,那么针对这些数据,如果产品经理看到的话,他要不要,这个需要小张去跟产品经理确认的。
    • 2,针对产品经理说的需要要的数据,举个例子,比如要抓取的企业的基本信息中有有邮编,有省,市,县(区)三级地址。这个时候小张其实可以确认下,我们是否已经有有邮政编码和地区的对应表,那么有的话,我是不是可以不抓这些省市地区县数据呢,这个也可以跟产品经理确认清楚。可以看看这些省市区县数据是否规范,如果不规范,就更没有必要抓取了,而且即使抓取,后期可能还要进行清洗。而如果我们已经有邮编和地区的对照表的话,我们是完全没有必要抓取这些数据的
    • 3,关于时间,如果产平经理要求有明确的的时间表,那么小张完全没有必要立即给出时间的,他完全可以先花几分钟,十几分钟,甚至几个小时先分析下页面解析难度,再给出时间的。相信我,有时候一个参数能让你纠结一天。

    分析要采集数据的url和相关参数

    • 其实如果这一步骤昨晚,基本上要花多少时间来解析数据已经可以估计八九不离十了。
    • 其实现在浏览器有很多工具可以帮助我们分析的提交参数和响应数据,下面我以全国企业信用信息公示系统中四川省的数据抓取为例子来分析:
    • 首先明确一下需求,我们只采集数据的基本登记信息,为什么要明确这点,因为:这个页面左侧有4个导航菜单,平均每个菜单中又有4到5个子菜单,而有的子菜单中又有不同类的数据,相信我如果你要全部解析,光准备测试数据都得花费一番功夫,因为模块虽然很多,单并不是所有企业的这些模块都有数据。

    我先走完我要抓取数据所经过的流程,见下面四张图片:

    • 1,输入搜索企业名称

    图1

    • 2,输入验证码,点击搜索

    图2

    • 3,搜索结果列表页面

    图3

    • 4,点击一条企业名称,打开企业详情页面,看到基本登记信息

    图4

    提取url和参数

    从上面四张图来看,我们可以确定有如下几个连接需要处理:- 1,获取验证码连接- 2,提交查询- 3,查看基本登记信息页面

    那么我们来看看这三步的提交地址和参数分别是什么,这里我们使用chrome的开发者工具来进行页面分析。类似的工具很多,各个浏览器自带的开发者工具基本都能满足需要,也可一使用一些第三方插件:如firebug,httpwatch等

    • 1,我们看到验证码的地址和参数:

    图6

    • 3,点击搜索的时候查看提交查询的地址和参数,注意提交的时候会看到有很多请求,比如页面肯定会请求很多静态资源,要学会过滤请求:

    图10

    • 3,点击某一条企业名称,打开企业详情界面图11

    编写代码实现功能

    通过之前的步骤,我们已经提取出了要采集企业的基本登记信息,需要提交三次请求,每次提交的方法(POST or GET),以及提交的参数。接下来就是用代码实现上述步骤,拿到你想要的数据即可。这篇文章不赘述代码实现的具体逻辑,因为本篇的重点还是在于说明:抓取一个网页的工作流程。后期针对代码实现过程中用到的关键技术点和踩过到的坑会逐一总结。暂时列出涉及到的相关内容:

    • 反爬虫规则:验证码识别,介绍easyocr和uuwise的使用
    • 反爬虫规则:使用代理
    • 反爬虫规则:httpclient头信息
    • 数据存储方式,介绍使用json存储在单字段以及优点和缺点


    也可一去我的个人站点 查看
    或者,欢迎关注俺的微信订阅号,每天一篇小笔记,每天提高一点点:
    公众好:enilu123


    展开全文
  • PHP 数据抓取

    千次阅读 2019-04-23 17:51:45
    这里说下, 两次抓取的情况, 第二次请求需要第一次数据抓取的结果 例如: 数据提交的时候需要页面上的token 抓取流程. 1. 抓取页面, 分析页面获取token 2. 提交数据, 带上第一次获取的token 存在的问题 token是...

    PHP 数据抓取, CURL比较容易

    这里说下, 两次抓取的情况, 第二次请求需要第一次数据抓取的结果

    例如: 数据提交的时候需要页面上的token

    抓取流程. 

    1. 抓取页面, 分析页面获取token

    2. 提交数据, 带上第一次获取的token

    存在的问题

    token是在后台通过session保存起来的

    而步骤1抓取数据的时候跟步骤2抓取数据的时候

    curl请求实际上是视为2次不同的请求, 所以sessionid并不一样

    导致第二次请求就算是带上了第一次获取到的token

    数据仍然是验证不通过的

    解决方案:

    关键部分 CURLOPT_COOKIEJAR 采用cookie存储请求的数据

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url); // 要访问的地址
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.69 Safari/537.36"); // 模拟用户使用的浏览器
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
    curl_setopt($ch, CURLOPT_COOKIEJAR, './cookie.txt');  // 关键部分, 使用cookie存储
    curl_setopt($ch, CURLOPT_POST, 1); // 发送一个常规的Post请求
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
    curl_setopt($ch, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
    $response = curl_exec($ch);
    curl_close($ch);

     

    展开全文
  • 1688网数据抓取-js抓取篇

    千次阅读 2020-07-30 22:28:43
    简单明了的接口分析,轻而易举的js数据抓取,你值得了解 最近写爬虫抓取了一下1688网的数据,特写此博客记录一下此次抓取的过程分析 进入1688首页后,输入关键字后进行商品的搜索(这里搜索的是手机)。显示页面如下...

    简单明了的接口分析,轻而易举的js数据抓取,你值得了解

    最近写爬虫抓取了一下1688网的数据,特写此博客记录一下此次抓取的过程分析

    进入1688首页后,输入关键字后进行商品的搜索(这里搜索的是手机)。显示页面如下
    在这里插入图片描述
    检查源码的时候却发现无该商品的信息,查询ajax接口时发现了该数据是如何传输过来的
    在这里插入图片描述
    对响应的数据进行分析发现数据一次性传递二十个商品的数据,在offerList中,包含了商品图片信息,厂家信息,起批量及其起批价格等信息,在此我们就已经获取了商品详情页的大部分信息,在该数据对象中都能够找到。但是我们想抓取评论和成交详情时,却发现没有相关的信息在这里插入图片描述
    于是我进一步分析js接口,总于找到了相关的信息,原来是将信息隐藏在了js中
    先找到了成交的详情信息,如下
    在这里插入图片描述
    评论的详情页也抓取到了呢,就在rates.json文件中呢,如下
    在这里插入图片描述
    接下来就模拟js发送请求,获得评论的详情信息。
    请求url如下:
    https://rate.1688.com/remark/offerDetail/rates.json?callback=jQuery17205288144649342565_1596117170400&_input_charset=GBK&offerId=622311787712&page=1&pageSize=15&starLevel=&orderBy=&semanticId=&showStat=1&content=1&t=1596117179370&memberId=b2b-2208236930474a47ee&isNeedInitRate=false

    经过自己试验发现,必要参数只有offerId,page,和memberId三个,这里的offerId容易获取,就是该商品url的最后一段数字 如下:
    https://detail.1688.com/offer/622311787712.html?spm=a26352.13672862.offerlist.296.68526458UjZwS3
    加粗字体就是商品的offerId,page就是需要爬取的页数,剩下的就是这个memberId不知从何下手,但经过自己的努力查找,终于让我捕获到了这个memberId,就在主页面的json数据中,如下图所示
    在这里插入图片描述
    成交信息与评论同样获取即可,接下来便可以拼凑自己的url发起请求了,思路如下:
    1.获取总页面数,自己拼凑url发送请求,获取商品数据
    2.根据商品数据,向每一个商品发送js请求,获取评论信息(这里需要注意一下,除了url外请求头还需要referer参数,该参数为当前页面的url,在json中也可以获取到,即为detailUrl)
    3.开启多线程进行爬取
    4.解析出自己需要的商品信息和对应多少页码的评论
    5.该方法为js接口抓取,实测有效,但需要很多高可用的IP进行切换爬取,不然会被防爬识别,进而需要登录验证

    代码如下(代码并未爬取完全,需要爬取完全需要自己更改需要爬取的商品数据,代码中有做注释哦!)

    from selenium import webdriver
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    import time
    from urllib.parse import urlencode
    import requests
    import json
    
    
    def open_html(url, send_msgs_dict):
        send_key = send_msgs_dict['send_key']
        broswer = webdriver.Chrome()
        wait = WebDriverWait(broswer,50)
        broswer.get(url)
        input = wait.until(
            EC.presence_of_element_located((By.ID,'home-header-searchbox'))
            )
        input.clear()
        input.send_keys(send_key)
        button = wait.until(
            EC.element_to_be_clickable((By.XPATH,'//*[@id="app"]/div/div[3]/section/div[2]/div/div/div/form/fieldset/div/div[2]/button'))
            )
        button.click()
        url = broswer.current_url
    
        time.sleep(2)
        broswer.close()
    
        return url
    
    def ajax_get(r_url,send_msgs_dict,pages,ua):
        print('正在获取页面接口......')
        r_text_obj_list = []
        lis = r_url.split('?')[1].split('&')
        dic = {}
        for i in lis:
            dic[i.split('=')[0]] = i.split('=')[1]
        keywords = dic['keywords']
        del dic['keywords']
        url = "https://search.1688.com/service/marketOfferResultViewService?"
        parmeter = {
            'sortType' : send_msgs_dict['send_type'],  #(综合,成交额,价格)
            'descendOrder' : send_msgs_dict['send_order'],  #(升序,降序)
            'uniqfield' : 'userid',   #不变
            'async' : 'true',   #不变
            'asyncCount' : 20,   #不变
            'beginPage' : 1,     #页码值,默认第一页
            'pageSize' : 60,    #不变
            'startIndex' : ''  #(起始值)
            }
        headers = {
            'user-agent': ua
        }
        for page in range(1,pages+1):
            for i in range(3):
                if i == 0:
                    parmeter['offset'] = 7
                parmeter['beginPage'] = page
                parmeter['startIndex'] = i*20
                new_parmeter = {}
                new_parmeter.update(dic)
                new_parmeter.update(parmeter)
                new_url = url + 'keywords=' + keywords +'&' + urlencode(new_parmeter)
                r = requests.get(new_url,headers=headers)
                r_text_obj_list.append(r)
            time.sleep(2)
        print('页面接口获取完毕!')
        return r_text_obj_list
    
    def js_success_month_get_total_page(url,refer_url,ua):
        headers = {
        'referer': refer_url,
        'user-agent': ua
        }
        res = requests.get(url,headers=headers)
        print(url)
        res_json = json.loads(res.text)
        total_pages = res_json['data']['totalPage']
        total_count = res_json['data']['totalCount']
        return total_pages,total_count
    
    def js_comment_get_total_page(url,refer_url,ua):
        headers = {
        'referer': refer_url,
        'user-agent': ua
        }
        res = requests.get(url,headers=headers).text
        res_json = json.loads(res)
        total_pages = res_json['data']['pageParam']['totalPage']
        total_count = res_json['data']['pageParam']['totalCount']
        return total_pages,total_count
    
    def js_success_month_get(url,refer_url,ua):
        headers = {
        'referer': refer_url,
        'user-agent': ua
        }
        res_list = []
        res = requests.get(url,headers=headers).text
        res_json = json.loads(res)
        try:
            order_list = res_json['data']['orderDisplayEntryList']
            for order_one in order_list:
                order_dic = {}
                #采购商
                order_dic['buyerName'] = order_one['buyerName']
                #采购数量
                order_dic['quantity'] = order_one['quantity']
                #采购总数
                order_dic['countBuyerQuantity'] = order_one['countBuyerQuantity']
                #单位
                order_dic['unit'] = order_one['unit']
                #采购时间
                order_dic['buyerPayTime'] = order_one['buyerPayTime']
                #采购价格
                order_dic['price'] = order_one['price']
                #规格
                order_dic['specInfo'] = order_one['specInfo']
                res_list.append(order_dic)
                # pass
        except:
            #月销量为空
            pass
        return res_list
    
    def js_comment_get(url,refer_url,ua):
        # print('正在获取评论页面数据......')
        headers = {
        'referer': refer_url,
        'user-agent': ua
        }
        res_list = []
        res = requests.get(url,headers=headers).text
        res_json = json.loads(res)
        try:
            rates_list = res_json['data']['rates']
            for rates_one in rates_list:
                rates_dic = {}
                #评论内容
                rates_dic['remarkContent'] = rates_one['rateItem'][0]['remarkContent']
                if rates_dic['remarkContent'] == '评价方未及时做出评价,系统默认好评!':
                    continue
                #采购数量
                rates_dic['quantity'] = rates_one['quantity']
                #采购总数
                rates_dic['countQuantity'] = rates_one['countQuantity']
                #用户名字
                rates_dic['member'] = rates_one['member']
                #规格
                rates_dic['specInfo'] = rates_one['specInfo']
                #评论时间
                rates_dic['remarkTime'] = rates_one['rateItem'][0]['remarkTime']
                res_list.append(rates_dic)
                # pass
        except:
            #评论为空
            pass
        return res_list
    
    def parse_r_text(r_text_obj_list,data_all,ua):
        for r_text_obj in r_text_obj_list:
            print('-------------------------------------------')
            print('正在分析第  '+str(r_text_obj_list.index(r_text_obj)+1)+'  个ajax接口对象...')
            r_text_json = json.loads(r_text_obj.text)
            all_list = r_text_json['data']['data']['offerList']
            print('商品数据长度=',len(all_list))
            n = 0
            for one in all_list:
                data = {}
                current_num_str = str(all_list.index(one)+1)
                member_id = one['company']['memberId']
                detail_url = one['information']['detailUrl']
                offerId = str(one['aliTalk']['infoId'])
    
                success_month_js_url = 'https://rate.1688.com/remark/offerDetail/saleRecords.json?offerId='+ offerId +'&currentPage=1&memberId=' + member_id
                success_month_total_pages,success_month_total_count = js_success_month_get_total_page(success_month_js_url,detail_url,ua)
                success_month_info_list = []
                print('正在获取第'+current_num_str+'个商品月销量页面数据......')
                for i in range(1,success_month_total_pages+1):
                    new_js_url = 'https://rate.1688.com/remark/offerDetail/saleRecords.json?offerId='+ offerId +'&currentPage='+str(i)+'&memberId=' + member_id
                    success_month_info_list += js_success_month_get(new_js_url,detail_url,ua)
                    time.sleep(0.5)
                print('获取第'+current_num_str+'个商品月销量页面数据完毕!')
    
                comment_js_url = 'https://rate.1688.com/remark/offerDetail/rates.json?offerId='+ offerId +'&currentPage=1&memberId=' + member_id
                comment_total_pages,comment_total_count = js_comment_get_total_page(comment_js_url,detail_url,ua)
                comment_info_list = []
                print('正在获取第'+current_num_str+'个商品评论页面数据......')
                for i in range(1,comment_total_pages+1):
                    new_js_url = 'https://rate.1688.com/remark/offerDetail/rates.json?offerId='+ offerId +'&currentPage='+str(i)+'&memberId=' + member_id
                    comment_info_list += js_comment_get(new_js_url,detail_url,ua)
                    time.sleep(0.5)
                print('获取第'+current_num_str+'个商品评论页面数据完毕!')
    
                #名称
                data['title'] = one['information']['simpleSubject']
                #图片地址
                data['img_url'] = one['image']['imgUrlOf290x290']
                #回购率
                data['repurchaseRate'] = one['information']['rePurchaseRate']
                #价格-起批量
                priceStart_list = one['tradePrice']['offerPrice']['quantityPrices']
                priceStart_dic = {}
                for one_priceStart in priceStart_list:
                    price = one_priceStart['valueString']
                    numStart = one_priceStart['quantity']
                    priceStart_dic['price'] = numStart
                #月成交量
                data['success_month'] = success_month_total_count
                #月成交详情
                data['success_month_info_list'] = success_month_info_list
                #评论数
                data['comment'] = comment_total_count
                #评论详情
                data['comment_info_list'] = comment_info_list
                #地址
                data['addr'] = one['company']['province']+one['company']['city']
                #规格
                data['brief'] = one['information']['brief']
    
                data_all.append(data)
                #用n变量记录每页爬取的商品数量,爬取全部可将下列三行代码进行注释
                n += 1
                if n > 2:
                    break
            print('第  '+str(r_text_obj_list.index(r_text_obj)+1)+'  个ajax接口对象分析完毕!')
        print('-------------------------------------------')
        print('全部对象分析完毕!')
    
    def main():
        data_all = []
        ua = 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36'
        url = 'https://www.1688.com/'
        send_key = '手机'
        send_type = '综合'
        send_order = '升序'
        #这里定义需要爬取的页码数
        pages = 1
        if pages > 50:
            pages = 50
        sortTypeDict = {
        '综合':'normal',
        '成交额':'va_rmdarkgmv30rt',
        '价格':'price'
        }
        descendOrderDict = {
        '升序':'false',
        '降序':'true'
        }
        send_msgs_dict = {'send_key':send_key,'send_type':sortTypeDict[send_type],'send_order':descendOrderDict[send_order]}
        r_url = open_html(url,send_msgs_dict)
        r_text_obj_list = ajax_get(r_url,send_msgs_dict,pages,ua)
        print('页面ajax接口对象个数------>',len(r_text_obj_list))
        parse_r_text(r_text_obj_list,data_all,ua)
        print('正在打印全部数据......')
        print(data_all)
        print('数据长度为=',len(data_all))
        print('爬取完成!')
    
    
    if __name__ == '__main__':
        main()
    
    

    此文章为个人探索得出,记录此文章仅为学习交流使用,希望能够帮助到学习中的你,一起努力一起加油吧!

    展开全文
  • 动态网页数据抓取

    千次阅读 2019-11-15 15:06:49
    动态网页数据抓取 一、网页 1.传统网页: 如果需要更新内容,则需要重新加载网页。 2.动态网页: 使用AJAX则不需要加载更新整个网页,实现部分内容更新。 二、什么是AJAX? AJAX(Asynchronouse JavaScript ...
  • 新闻数据抓取

    千次阅读 2018-04-11 17:27:33
    新闻数据抓取 这篇文章,主要是记录自己学习爬虫过程。 整篇部分会分为2篇文章, 1,爬取http的网页(新闻网站):获取各类主题的新闻的内容,eg:金融,体育,娱乐等等。 2,爬取https的网页(豆瓣):获取...
  • Python网络数据抓取

    千次阅读 2017-06-01 11:10:11
    python网络数据抓取
  • 数据抓取常用工具

    千次阅读 2020-05-02 13:17:00
    数据抓取 库: requests、urllib、pycurl 工具:curl、wget、httpie 数据分析 数据存储 常用工具的使用: 1. curl: 安装: apt install curl 安装的时候可能会报错,有可能是openssl没装 apt install open...
  • 网页数据抓取思路

    2019-03-22 16:01:10
    在网页数据采集的时候,我们往往要经过这几个大的步骤: ①通过URL地址读取目标网页 ②获得网页源码 ...引用java网页数据抓取实例 利用Jsoup模拟跳过登录爬虫获取数据 参考Java简单的抓取网页数据 ...
  • python 数据抓取三种方法

    千次阅读 多人点赞 2021-02-06 21:14:56
    三种数据抓取的方法 正则表达式(re库) BeautifulSoup(bs4) lxml
  • 概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容。主要是对电脑笔记本以及他们的属性进行抓取,然后在使用nodejs进行下载图片和插入数据库操作。
  • 续前文:《数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置》。 程序优化:第一步 开始: for i in range(startx,total):  for j in range(starty,total):  BASE_URL = ...
  • 我们在做数据网络爬虫、网站数据采集、网页数据抓取都会遇到的三个问题就是:验证码问题和封IP问题以及账号登录问题 python爬虫-selenium破解封IP+pytesseract破解验证码+AI破解网页加密  一直在it大咖网从事...
  • 用大白话说就是数据抓取。目前有四大方式获取数据: 1.网络爬虫 用Python及Go等开发自己的爬虫平台,对几十个网站进行每日抓取获得相关信息(详见:能利用爬虫技术做到哪些很酷很有趣很有用的事情?-何明科的回答) ...
  • 抖音数据抓取

    万次阅读 2018-12-14 16:20:06
    这个简单demo实现抓取抖音的防抓数据 思路 截图下数据发送到AI接口识别数字返回数据 依赖 puppeteer 百度AI接口 pm2 使用 cd dy pm2 start dy -i 4 // 可以借助pm2实现多进程抓取 ...
  • Fiddler抓取HttpClient数据抓取不到的问题 client.getHostConfiguration().setProxy(Log.ip, Log.port);
  • 大数据分析进阶之python财经数据抓取
  • 介绍一种有趣的数据抓取技术:可见即可抓

    万次阅读 多人点赞 2020-02-02 13:15:56
    实际上,selenium并不是专门用于数据抓取的工具,而是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器。用selenium抓取数据,并不是一个通用的方法,因为它仅支持GET...
  • 文章主要介绍了数据抓取之Requests HTTP 库。
  • 背景 现如今,数据成为了越来越重要的网络资源,越来越有价值。无论是数据的分析还是前后端页面的数据交互,都离不开真实有效的数据。...购买代理IP库,随机获取IP进行数据抓取 部署多个应用分别
  • APP数据采集 / 网站页面数据采集 / 小程序数据抓取定制软件采集数据服务 【服务介绍】 对国内外APP、网站、小程序数据进行采集,并可以按照您的要求把采集好的数据整理成需要的格式(txt/excel/sql/pdf), 从事...
  • 基于R语言的表格数据抓取

    千次阅读 2019-04-13 10:12:37
    R中有非常多的包可以用来抓取网络数据,之前总结过用rvest包抓取数据的步骤及方法,用rvest包轻松抓取网络数据,这里主要说一说关于表格数据抓取的方法和一些注意的点。 如果之前对R爬虫有一点点了解,那么抓取表格...
  • 我们以网页数据抓取来说,一门基于web结构或基于浏览器可视化的数据获取技术,关键点在于抓取的准确性和应对海量数据时的快速反应,甚至于对一个工具来说,关键点还在于是否通用,功能是否强大。网页数据抓取如今在...
  • 送给宝妈程序媛的 福利,育儿网数据抓取,育儿数据本地存储,查阅省时省力省流量。python 爬虫小课
  • Asp.net数据抓取

    2014-04-20 11:51:15
    Asp.net数据抓取,http://www.51aspx.com/code/CrawlData
  • 抖音短视频数据抓取实战系列(八)——Mitmproxy抓取用户详细信息并入库
  • 数据抓取是一门艺术,和其他软件不同,世界上不存在完美的、一致的、通用的抓取工具。为了不同的目的,需要定制不同的代码。不过,我们不必Start from Scratch,已经有许多的基本工具、基本方法和基础框架可供使用。...
  • java爬虫实现数据抓取

    千次阅读 2016-09-12 21:09:58
    这篇博客我们将用java来实现基本的爬虫数据抓取操作,基本思路就是通过java访问url,然后拿到返回的html文档,并用jsoup解析。 首先我们来看下需要抓取的页面,以我自己的csdn博客列表页面为例。我们将每篇博客的...
  • 企查查app新增企业数据抓取

    千次阅读 2019-07-09 10:53:53
    企查查每日新增企业数据抓取 尚未完成的工作: 需要自行抓包获取设备id,appid,sign等等 sign和时间戳保持一致即可 把所有的数据库、redis配置 无法自动登录,账号需要独立 redis数据转存mysql 企查查限制,每分钟...
  • 数据抓取必须学会的三种技术

    千次阅读 2016-11-03 11:33:26
    数据抓取 爬虫

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,635
精华内容 14,254
关键字:

数据抓取