Python实现可视化爬虫实现“京东试用”批量报名!大致吊炸天!

by admin on 2019年11月6日

介绍:

今天主要是来说一下怎么可视化来监控你的爬虫的状态。

《黑暗之魂》一直以来都是玩家极为熟悉的虐人游戏系列,透过高难度的操作和强大的怪物,让玩家在挑战的过程中死上许多次。而《小小大星球》则是许多玩家所熟知的平台益智游戏系列,操控可爱的人物解谜外,也能自行设置关卡。两个看起来是完全不相关的系列,但如果把他们结合后会是什麽模样呢?

想获取某人发的所有微博信息,发现新浪微博的API里存在局限性,不仅需要申请高级接口,而且还要用户授权才能获取他发的全部微博。既然没有接口,那么就自己写个爬虫吧!
先附上项目代码地址:微博爬虫源码
项目的执行需要安装
selenium,requests以及BeautifulSoup库,还需要chromeDriver来配合。
首先,我们要在浏览器里打开微博去分析获取某个人的微博都需要哪些参数,以及调用了哪些请求。
分析得出结果如下:
获取微博的请求都需要有一个cookie,并且cookie存在的有效时间还是比较长的。

对于大多数朋友而言,爬虫绝对是学习 python 的最好的起手和入门方式。因为爬虫思维模式固定,编程模式也相对简单,一般在细节处理上积累一些经验都可以成功入门。本文想针对某一网页对 python 基础爬虫的两大解析库( BeautifulSoup 和 lxml )和几种信息提取实现方法进行分析,以开 python 爬虫之初见。

图片 1

相信大家在跑爬虫的过程中,也会好奇自己养的爬虫一分钟可以爬多少页面,多大的数据量,当然查询的方式多种多样。今天我来讲一种可视化的方法。

这个《小小大星球3》关卡是玩家 Katapultoffel
耗时一个月的杰作,他以《黑暗之魂》的初始地区北方不死院为目标,运用《小小大星球
3》来重现该道场景,不管是路线还是景象都巧妙地呈现了出来,而人物的操作也是相当贴近《黑暗之魂》的体验,他也分享了关卡中的每道要素设置供玩家参考,有兴趣的玩家不妨也尝试制作看看吧!

登录微博多次会需要验证码,为了避免验证码的阻碍,尽量把cookie存起来,等cookie失效了再去模拟登录获取cookie。

基础爬虫的固定模式

笔者这里所谈的基础爬虫,指的是不需要处理像异步加载、验证码、代理等高阶爬虫技术的爬虫方法。一般而言,基础爬虫的两大请求库 urllib 和 requests 中 requests 通常为大多数人所钟爱,当然 urllib 也功能齐全。两大解析库 BeautifulSoup 因其强大的 HTML 文档解析功能而备受青睐,另一款解析库 lxml 在搭配 xpath 表达式的基础上也效率提高。就基础爬虫来说,两大请求库和两大解析库的组合方式可以依个人偏好来选择。

笔者喜欢用的爬虫组合工具是:

  • requests + BeautifulSoup

  • requests + lxml

 

关于爬虫数据在mongodb里的版本我写了一个可以热更新配置的版本,即添加了新的爬虫配置以后,不用重启程序,即可获取刚刚添加的爬虫的状态数据。

《小小大星球3》还原《黑暗之魂》视频:

微博的每一页可以分为3屏,首屏的接口与2,3屏接口不一致。下面4,5两点的接口用的是MRJ台湾官方的微博为例子。

同一网页爬虫的四种实现方式

笔者以腾讯新闻首页的新闻信息抓取为例。

首页外观如下:

图片 2

比如说我们想抓取每个新闻的标题和链接,并将其组合为一个字典的结构打印出来。首先查看 HTML 源码确定新闻标题信息组织形式。

图片 3

可以目标信息存在于 em 标签下 a 标签内的文本和 href 属性中。可直接利用 requests 库构造请求,并用 BeautifulSoup 或者 lxml 进行解析。

  • 方式一: requests + BeautifulSoup + select css选择器

    1 # select method
    2 import requests
    3 from bs4 import BeautifulSoup
    4 headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36’}
    5
    6 url = ”
    7
    8 Soup = BeautifulSoup(requests.get(url=url, headers=headers).text.encode(“utf-8″), ‘lxml’)
    9
    10 em = Soup.select(’em[class=”f14 l24”] a’)
    11 for i in em:
    12
    13 title = i.get_text()
    14
    15 link = i[‘href’]
    16
    17 print({‘标题’: title,
    18 ‘链接’: link
    19
    20 })

很常规的处理方式,抓取效果如下:

图片 4

  • 方式二: requests + BeautifulSoup + find_all 进行信息提取

    1 # find_all method
    2 import requests
    3 from bs4 import BeautifulSoup
    4 headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36’}
    5
    6 url = ”
    7
    8 Soup = BeautifulSoup(requests.get(url=url, headers=headers).text.encode(“utf-8”), ‘lxml’)
    9
    10 em = Soup.find_all(’em’, attrs={‘class’: ‘f14 l24’})for i in em:
    11
    12 title = i.a.get_text()
    13
    14 link = i.a[‘href’]
    15
    16 print({‘标题’: title,
    17 ‘链接’: link
    18
    19 })

同样是 requests + BeautifulSoup 的爬虫组合,但在信息提取上采用了 find_all 的方式。效果如下:

图片 5

  • 方式三: requests + lxml/etree + xpath 表达式

    1 # lxml/etree method
    2 import requests
    3 from lxml import etree
    4
    5
    6
    7 headers = { ‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36’}
    8
    9 url = ”
    10
    11 html = requests.get(url = url, headers = headers)
    12
    13 con = etree.HTML(html.text)
    14
    15
    16
    17 title = con.xpath(‘//em[@class=”f14 l24″]/a/text()’)
    18
    19 link = con.xpath(‘//em[@class=”f14 l24″]/a/@href’)
    20 for i in zip(title, link):
    21
    22 print({‘标题’: i[0],
    23 ‘链接’: i[1]
    24
    25 })

使用 lxml 库下的 etree 模块进行解析,然后使用 xpath 表达式进行信息提取,效率要略高于 BeautifulSoup + select 方法。这里对两个列表的组合采用了 zip 方法。python学习交流群:125240963效果如下:

图片 6

  • 方式四: requests + lxml/html/fromstring + xpath 表达式

    1 # lxml/html/fromstring method
    2 import requests
    3 import lxml.html as HTML
    4
    5
    6
    7 headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36’}
    8
    9 url = ”
    10
    11 con = HTML.fromstring(requests.get(url = url, headers = headers).text)
    12
    13 title = con.xpath(‘//em[@class=”f14 l24″]/a/text()’)
    14
    15 link = con.xpath(‘//em[@class=”f14 l24″]/a/@href’)
    16 for i in zip(title, link):
    17
    18 print({‘标题’: i[0],’链接’: i[1]
    19
    20 })

跟方法三类似,只是在解析上使用了 lxml 库下的 html.fromstring 模块。抓取效果如下:

图片 7

很多人觉得爬虫有点难以掌握,因为知识点太多,需要懂前端、需要python熟练、还需要懂数据库,更不用说正则表达式、XPath表达式这些。其实对于一个简单网页的数据抓取,不妨多尝试几种抓取方案,举一反三,也更能对python爬虫有较深的理解。长此以往,对于各类网页结构都有所涉猎,自然经验丰富,水到渠成。

 

环境:chromedriver2.41.578700+ selenuim3.14.0

1.成品图

视频截图:

每一页的首屏接口为:http://weibo.com/mrj168?is\_all=1&profile\_ftype=1&page=1
page为第几页

中奖概率:假设每件商品有10000人申请,则申请一件商品,不中奖的概率为0.9999,平均10天有5000件商品更新,则5000件都不中奖的概率为0.9999的5000次方,为0.6065,也就是连续10天不中奖的概率为0.6065,按上述方法,连续30天不中奖的概率为0.2231,所以说中奖的几率是很大的。

图片 8 

图片 9

每一页的2,3屏接口为:http://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain=100505&pagebar=0&is\_tag=0&is\_search=0&pre\_page=1&profile\_ftype=1&id=1005051837498771&script\_uri=%2Fmrj168&feed\_type=0&\_\_rnd=1490768727000&pl\_name=Pl\_Official\_MyProfileFeed\_\_22&is\_all=1&domain\_op=100505&page=1
需要修改的参数为pagebar,第二屏和第三屏分别为0,1。以及pre_page和page均为第几页。rnd为当前时间戳,单位是毫秒。id为100505+“微博的ID”,script_uri为“/”+“个性域名”或者”/”+”/u/”+”微博的ID”

过程:

这个是监控服务器网速的最后成果,显示的是下载与上传的网速,单位为M。爬虫的原理都是一样的,只不过将数据存到InfluxDB的方式不一样而已,
如下图。

图片 10

通过以上的分析,把逻辑转换成代码。大致流程如下:

1.打开京东主页

图片 11 

图片 12

result = is_valid_cookie()
print result
if result == False:
    driver = webdriver.Chrome("/Users/fantasy/Downloads/chromedriver")#打开Chrome
    driver.maximize_window()#将浏览器最大化显示
    driver.get(weibo_url)#打开微博登录页面
    time.sleep(10)#因为加载页面需要时间,所以这里延时10s来确保页面已加载完毕
    cookie = login_weibo_get_cookies()
    save_cookie(cookie)
    save_cookie_update_timestamp(get_timestamp())
else :
    cookie = get_cookie_from_txt()
for x in xrange(1,page_size+1):
    profile_html = get_object_top_weibo_by_person_site_name_and_cookie(person_site_name,cookie,x)
    image_url_list = get_img_urls_form_html(profile_html)
    write_image_urls(image_url_list)
    for y in xrange(0,2):#有两次下滑加载更多的操作
        print "pagebar:"+str(y)
        html = get_object_weibo_by_weibo_id_and_cookie(weibo_id,person_site_name,cookie,y,x)
        image_url_list = get_img_urls_form_html(html)
        write_image_urls(image_url_list)

2.登录京东

可以实现对爬虫数量,增量,大小,大小增量的实时监控。

首先判断本地是否存在有效的Cookie,如果Cookie不存在或者过期了,那么使用webdriver去打开微博登录并获取Cookie,然后更新本地的Cookie和更新时间。如果Cookie有效,则直接读取本地的Cookie。
有了Cookie之后,我们就可以拿着Cookie去调用上面分析出的两个接口啦!
通过个性域名和Cookie及页码去请求某一页的首屏。

3.打开京东试用页面

  1. 环境

通过微博ID和个性域名及页码和第几屏去获取某一页的第几屏。

4.获取商品列表

  • InfluxDb ,是目前比较流行的时间序列数据库;
  • Grafana
    ,一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源
  • Ubuntu
  • influxdb (pip install influxdb)
  • Python 2.7

接口返回的内容并不是json,而是HTML格式的文本,所以需要我们自己去解析。这里我使用的是BeautifulSoup来分析HTML的元素的。
以每页首屏的接口为例子:

5.自动申请试用(该商品已经申请过则跳过)

  1. 原理
def get_object_top_weibo_by_person_site_name_and_cookie(person_site_name,cookie,page):#每一页顶部微博
    try:
        profile_url = weibo_url+person_site_name+"?"
        headers["Cookie"] = cookie
        profile_request_params["page"] = page
        response = requests.get(profile_url,headers=headers,params=profile_request_params)
        print response.url
        html = response.text
        soup = BeautifulSoup(html,"html.parser")
        script_list = soup.find_all("script")
        script_size = len(script_list)
        print "script_size:"+str(script_size)
        tag = 0
        for x in xrange(script_size):
            if "WB_feed WB_feed_v3 WB_feed_v4" in str(script_list[x]):
                tag = x
        print "tag:"+str(tag)
        # print script_list[script_size-1]
        html_start = str(script_list[tag]).find("<div")
        html_end = str(script_list[tag]).rfind("div>")
        # print str(script_list[tag])[html_start:html_end+4]
        return str(str(script_list[tag])[html_start:html_end+4])
    except Exception, e:
        print e
    finally:
        pass

6.实现循环

获取要展示的数据,包含当前的时间数据,存到InfluxDb里面,然后再到Grafana里面进行相应的配置即可展示;

直接使用find_all来获取所有图片,再用get(“src”)来获取图片的url。

程序详单:

  1. 安装

然后我的微博爬虫就这样实现了,好像也不难的样子。。。但是面对微博接口返回的一大堆数据,需要耐心去分析。

小编在此谢谢大家的观看!Python很容易学!所以小编有弄一个交流,互问互答,资源共享的交流学习基地,如果你也是Python的学习者或者大牛都欢迎你来!㪊:548+377+875!一起
学习共同进步!

4.1 Grafana安装

图片 13

官方安装指导

 

安装好以后,打开本地的3000端口,即可进入管理界面,用户名与密码都是 admin

图片 14

4.2 InfulxDb安装

 

这个安装就网上自己找吧,有很多的配置我都没有配置,就不在这里误人子弟了。

第一天就中奖了,哈哈。

  1. InfluxDb简单操作

 

碰到了数据库,肯定要把增删改查学会了啊,
和sql几乎一样,只有一丝丝的区别,具体操作,大家可以参考官方的文档。

  • influx 进入命令行
  • CREATE DATABASE test 创建数据库
  • show databases 查看数据库
  • use test 使用数据库
  • show series 看表
  • select * from table_test 选择数据
  • DROP MEASUREMENT table_test 删表
  1. 存数据

InfluxDb数据库的数据有一定的格式,因为我都是利用python库进行相关操作,所以下面将在python中的格式展示一下:

图片 15 

其中:

  • measurement, 表名
  • time,时间
  • tags,标签
  • fields,字段

可以看到,就是个列表里面,嵌套了一个字典。其中,对于时间字段,有特殊要求,可以参考这里,
下面是python实现方法:

图片 16 

所以,到这里,如何将爬虫的相关属性存进去呢?以MongoDB为例

图片 17 

那么现在我们已经往数据里存了数据了,那么接下来要做的就是把存的数据展示出来。

7.展示数据

7.1 配置数据源

以admin登录到Grafana的后台后,我们首先需要配置一下数据源。点击左边栏的最下面的按钮,然后点击DATA
SOURCES,这样就可以进入下面的页面:

图片 18 

点击ADD DATA SOURCE,进行配置即可,如下图:

图片 19 

其中,name自行设定;Type
选择InfluxDB;url为默认的,
其他的因为我前面没有进行配置,所以默认的即可。然后在InfluxDB
Details里的填入Database名,最后点击测试,如果没有报错的话,则可以进入下一步的展示数据了;

7.2 展示数据

点击左边栏的+号,然后点击GRAPH

图片 20 

接着点击下图中的edit进入编辑页面:

图片 21

图片 22

从上图中可以发现:

中间板块是最后的数据展示
下面是数据的设置项
右上角是展示时间的设置板块,在这里可以选择要展示多久的数据

7.2.1 配置数据

在Data
Source中选择刚刚在配置数据源的时候配置的NAME字段,而不是database名。
接着在下面选择要展示的数据。看着就很熟悉是不是,完全是sql语句的可视化。同时,当我们的数据放到相关的字段上的时候,双击,就会把可以选择的项展示出来了,我们要做的就是直接选择即可;
设置右上角的时间,则可以让数据实时进行更新与展示
因为下面的配置实质就是sql查询语句,所以大家按照自己的需求,进行选择配置即可,当配置完以后,就可以在中间的面板里面看到数据了。

  1. 总结

到这里,本篇文章就结束了。其中,对于Grafana的操作我没有介绍的很详细,因为本篇主要讲的是怎么利用这几个工具完成我们的任务。

同时,里面的功能确实很多,还有可以安装的插件。我自己目前还是仅仅对于用到的部分比较了解,所以大家可以查询官方的或者别的教程资料来对Grafana进行更深入的了解,制作出更加好看的可视化作品来。

文末知识点摘要①:sql中dateiff函数的用法

DATEDIFF

返回跨两个指定日期的日期和时间边界数。

一、 语法

DATEDIFF ( datepart , startdate , enddate )

二、参数

datepart

是规定了应在日期的哪一部分计算差额的参数。下表列出了 Microsoft® SQL
Server? 识别的日期部分和缩写。

日期部分 缩写

year yy, yyyy
quarter qq, q
Month mm, m
dayofyear dy, y
Day dd, d
Week wk, ww
Hour hh
minute mi, n
second ss, s
millisecond ms
startdate

是计算的开始日期。startdate 是返回 datetime 或 smalldatetime
值或日期格式字符串的表达式。

因为 smalldatetime 只精确到分钟,所以当用 smalldatetime
值时,秒和毫秒总是 0。


果您只指定年份的最后两位数字,则小于或等于”两位数年份截止期”配置选项的值的最后两位数字的数字所在世纪与截止年所在世纪相同。大于该选项的值的最后
两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如,如果 two digit
year cutoff 为 2049(默认),则 49被解释为 2049,2050 被解释为
1950。为避免模糊,请使用四位数的年份。

enddate

是计算的终止日期。enddate 是返回 datetime 或 smalldatetime
值或日期格式字符串的表达式。

三、返回类型

integer

四、用法

此函数计算两个指定日期之间日期部分的数目。结果为日期部分中等于(date2 –
date1)的有符号的整数值。

当结果不是日期部分的偶数倍时,DATEDIFF 将被截断而不是被舍入。

当使用 day 作为日期部分时,DATEDIFF
返回两个指定的时间之间(包括第二个日期但不包括第一个日期)的午夜数。

当使用 month 作为日期部分时,DATEDIFF
返回两个日期之间(包括第二个日期但不包括第一个日期)出现的月的第一天的数目。

当使用 week 作为日期部分时,DATEDIFF
返回两个日期(包括第二个日期但不包括第一个日期)之间星期日的数目。

对于更小的时间单位存在溢出值:

milliseconds 24 天

seconds 68 年

minutes 4083 年

others 没有溢出限制

如果超出这些限制,此函数将返回溢出错误。

五、标准和兼容性

SQL/92 Transact-SQL 扩展。
SQL/99 Transact-SQL 扩展。

Sybase 与 Adaptive Server Enterprise 兼容。

六、示例

下面的语句返回 1 :

select datediff( hour, ''4:00am'', ''5:50am'' )

下面的语句返回 102 :

select datediff( month, ''1987/05/02'', ''1995/11/15'' )

下面的语句返回 0 :

select datediff( day, ''00:00'', ''23:59'' )

下面的语句返回 4 :

select datediff( day, ''1999/07/19 00:00'',''1999/07/23 23:59'' )

下面的语句返回 0 :

select datediff( month, ''1999/07/19'', ''1999/07/23'' )

下面的语句返回 1 :

select datediff( month, ''1999/07/19'', ''1999/08/23'' )

总结

以上所述是小编给大家介绍的Python实现数据可视化看如何监控你的爬虫状态,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

您可能感兴趣的文章:

  • Python实现的连接mssql数据库操作示例
  • python
    MNIST手写识别数据调用API的方法
  • Python数据分析matplotlib设置多个子图的间距方法
  • python
    读取摄像头数据并保存的实例
  • Windows7下Python3.4使用MySQL数据库
  • 利用Python如何批量修改数据库执行Sql文件
  • Python+Pandas
    获取数据库并加入DataFrame的实例
  • Python使用pymysql从MySQL数据库中读出数据的方法
  • python
    批量修改/替换数据的实例
  • 分析python请求数据

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图