Python是我比较喜欢的语言,莫名的喜欢,对Python的学习可能起初是敲错了网址开始的,哈哈哈~

工作的任务从一个网站后台做登录、爬取数据,写入服务器Redis中,同事认为我会用PHP来写,哼!让你猜到那该多没意思,于是乎有了如下Python的代码,你看50多行搞定了。

  1. #!/usr/bin/python3
  2. import requests
  3. import re
  4. import redis
  5. from pyquery import PyQuery as pq
  6.  
  7. loginUrl = 'https://manage.xxx.com.cn/home/login'
  8. userName = 'xxx'
  9. passWord = 'xxx'
  10.  
  11. redisServer = '192.168.0.2'
  12. redisPort = 6379
  13. redisPass = ''
  14.  
  15. productList = {'椰油':'CL_Spot','咖啡':'COFFEE','工业铜':'COPPER'}
  16. volumeList = {'CL_Spot':[0, 0], 'COFFEE':[0, 0], 'COPPER':[0, 0]}
  17.  
  18. def main():
  19. jsessionid = getCookie()
  20. doLogin(jsessionid)
  21. dataUrl = 'https://manage.xxx.cn/?pageNo=1&pageSize=100'
  22. cookies = {'JSESSIONID': jsessionid}
  23. r = requests.get(dataUrl, cookies = cookies)
  24. dom = pq(r.text)
  25. lines = dom('table').eq(1).find('tr').items()
  26. for line in lines:
  27. line = re.sub(r'<!--.*-->', '', str(line))
  28. pattern = re.compile(r'<td>(.*?)</td>')
  29. group = pattern.findall(line)
  30. if not group:
  31. continue
  32. productCode = productList[group[3]]
  33. if group[6] == '买':
  34. volumeList[productCode][0]+= int(group[7]) * int(group[8])
  35. if group[6] == '卖':
  36. volumeList[productCode][1]+= int(group[7]) * int(group[8])
  37.  
  38. redisClient = redis.Redis(host=redisServer, port=redisPort, password=redisPass)
  39. for x in volumeList:
  40. keyUp = 'redis_order_count_u_%s' % x
  41. keyDown = 'redis_order_count_d_%s' % x
  42. redisClient.set(keyUp, int(volumeList[x][0]))
  43. redisClient.set(keyDown, int(volumeList[x][1]))
  44.  
  45. def getCookie():
  46. ua = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
  47. r = requests.get(loginUrl, headers = ua)
  48. return r.cookies['JSESSIONID']
  49.  
  50. def doLogin(jsessionid):
  51. param = {'userName': userName, 'password': passWord}
  52. cookies = {'JSESSIONID': jsessionid}
  53. requests.post(loginUrl, data = param, cookies = cookies)
  54.  
  55. if __name__ == '__main__':
  56. main()

另一个服务也需要这个需求,用了最近看的Golang来实现一次,瞧写了100多行

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "net/http"
  6. "net/url"
  7. "os"
  8. "strings"
  9. "strconv"
  10. "gopkg.in/redis.v4"
  11. "github.com/PuerkitoBio/goquery"
  12. )
  13.  
  14. var loginUrl string = "https://manage.xxx.com.cn/home/login"
  15. var dataUrl string = "https://manage.xxx.com.cn/?pageNo=1&pageSize=100"
  16. var userName string = "xxx"
  17. var passWord string = "xxx"
  18. var redisServer string = "192.168.1.2"
  19. var redisPort string = ""
  20. var redisPass string = ""
  21. var redisDB int = 0
  22.  
  23. func main() {
  24. productList := make(map[string] string)
  25. productList["椰油"] = "CL_Spot"
  26. productList["咖啡"] = "COFFEE"
  27. productList["工业铜"] = "COPPER"
  28. volumeList := make(map[string] int)
  29. volumeList["u_CL_Spot"] = 0
  30. volumeList["d_CL_Spot"] = 0
  31. volumeList["u_COFFEE"] = 0
  32. volumeList["d_COFFEE"] = 0
  33. volumeList["u_COPPER"] = 0
  34. volumeList["d_COPPER"] = 0
  35. jsessionid := getCookie()
  36. doLogin(jsessionid)
  37.  
  38. request, err := http.NewRequest("GET", dataUrl, nil)
  39. request.AddCookie(&http.Cookie{Name: "JSESSIONID", Value: jsessionid})
  40. client := &http.Client{}
  41. response, err := client.Do(request)
  42. if err != nil {
  43. fmt.Println(err.Error())
  44. os.Exit(0)
  45. }
  46. defer response.Body.Close()
  47. doc, err := goquery.NewDocumentFromReader(response.Body)
  48. doc.Find("table").Eq(1).Find("tr").Each(func(i int, tr *goquery.Selection) {
  49. td := tr.Find("td")
  50. name := td.Eq(3).Text()
  51. dir := td.Eq(6).Text()
  52. if val, ok := productList[name]; ok {
  53. buyNum, _ := strconv.Atoi(td.Eq(7).Text())
  54. buyUnit, _ := strconv.Atoi(td.Eq(8).Text())
  55. num := buyNum * buyUnit
  56. cacheKey := ""
  57. if dir == "买" {
  58. cacheKey = fmt.Sprintf("u_%s", val)
  59. } else if dir == "卖" {
  60. cacheKey = fmt.Sprintf("d_%s", val)
  61. }
  62. volumeList[cacheKey] += num
  63. }
  64. })
  65. redisClient := redis.NewClient(&redis.Options{
  66. Addr: fmt.Sprintf("%s:%s", redisServer, redisPort),
  67. Password: redisPass,
  68. DB: redisDB,
  69. })
  70. for k, v := range volumeList {
  71. strKey := fmt.Sprintf("redis_order_count_%s", k)
  72. redisClient.Set(strKey, int(v), 0)
  73. }
  74. fmt.Println("puti volume get success")
  75. }
  76.  
  77. func getCookie() string {
  78. jsessionid := ""
  79. response, err := http.Get(loginUrl)
  80. if err != nil {
  81. fmt.Println(err.Error())
  82. os.Exit(0)
  83. }
  84. defer response.Body.Close()
  85. for _, val := range response.Cookies() {
  86. if val.Name == "JSESSIONID" {
  87. jsessionid = val.Value
  88. }
  89. }
  90. return jsessionid
  91. }
  92.  
  93. func doLogin(jsessionid string) bool {
  94. data := url.Values{}
  95. data.Set("userName", userName)
  96. data.Add("password", passWord)
  97. request, _ := http.NewRequest("POST", loginUrl, strings.NewReader(data.Encode()))
  98. request.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  99. request.Header.Add("Content-Length", strconv.Itoa(len(data.Encode())))
  100. request.AddCookie(&http.Cookie{Name: "JSESSIONID", Value: jsessionid})
  101. client := &http.Client{}
  102. response, err := client.Do(request)
  103. if err != nil {
  104. fmt.Println(err.Error())
  105. os.Exit(0)
  106. }
  107. defer response.Body.Close()
  108. return true
  109. }

Python的实现到上线半天的功夫搞定了,Go足足搞了1整天,蹩脚的语法与不熟悉的语法让我学习了很多知识点,最后Mac编译到Linux上执行也给我上了一课。

觉得入门学习这两门语言挺好,一个是脚本语言另一个是编译语言,用处都很广泛。轩轩你准备好了吗?

比较爬虫用的语言Python与Go的更多相关文章

  1. golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍

    golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍 go语言爬虫框架:gocolly/colly,goquery,colly,chrom ...

  2. 【Python】【爬虫】如何学习Python爬虫?

    如何学习Python爬虫[入门篇]? 路人甲 1 年前 想写这么一篇文章,但是知乎社区爬虫大神很多,光是整理他们的答案就够我这篇文章的内容了.对于我个人来说我更喜欢那种非常实用的教程,这种教程对于想直 ...

  3. 深入浅出爬虫之道: Python、Golang与GraphQuery的对比

    深入浅出爬虫之道: Python.Golang与GraphQuery的对比 本文将分别使用 Python ,Golang 以及 GraphQuery 来解析某网站的 素材详情页面 ,这个页面的特色是具 ...

  4. Python爬虫之小试牛刀——使用Python抓取百度街景图像

    之前用.Net做过一些自动化爬虫程序,听大牛们说使用python来写爬虫更便捷,按捺不住抽空试了一把,使用Python抓取百度街景影像. 这两天,武汉迎来了一个德国总理默克尔这位大人物,又刷了一把武汉 ...

  5. 基于scrapy爬虫的天气数据采集(python)

    基于scrapy爬虫的天气数据采集(python) 一.实验介绍 1.1. 知识点 本节实验中将学习和实践以下知识点: Python基本语法 Scrapy框架 爬虫的概念 二.实验效果 三.项目实战 ...

  6. python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学

    首发于:python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=431 本文 ...

  7. 决策树ID3原理及R语言python代码实现(西瓜书)

    决策树ID3原理及R语言python代码实现(西瓜书) 摘要: 决策树是机器学习中一种非常常见的分类与回归方法,可以认为是if-else结构的规则.分类决策树是由节点和有向边组成的树形结构,节点表示特 ...

  8. 浅谈爬虫 《一》 ===python

    浅谈爬虫 <一> ===python  ‘’正文之前先啰嗦一下,准确来说,在下还只是一个刚入门IT世界的菜鸟,工作近两年了,之前做前端的时候就想写博客来着,现在都转做python了,如果还 ...

  9. 标准爬虫初探,来自Python之父的大餐!

    首先不得不承认自己做了标题党.本文实质是分析500lines or less的crawlproject,这个project的地址是https://github.com/aosabook/500line ...

随机推荐

  1. MySQL安装时MySQL server一直安装失败日志显示This application requires Visual Studio 2013 Redistributable

    使用MySQL社区版的msi包进行安装,试了好多次,别的组件都能正常安装,只有MySQL server的安装状态显示为fail.删除所有安装的程序,包括所依赖的各种Microsoft发布的包,删除所有 ...

  2. ng/cli new skip install and do not create a folder

    ng new myApp --skip-install --directory ./

  3. Request类源码分析

    通过APIView进入找到Request的源码 可以看见一堆属性和方法,其中request.data其实是一个方法,被包装成一个属性 继续看__getattr__和query_params方法: 代码 ...

  4. Layui使用心得(1)---- 数据表格

    前端的框架我了解的不是太多,现在在用Layui的框架开发.之后准备转向Vue和React 这一系列博客主要讲一些我使用的Layui的常用组件的心得,官方的网站讲解已经很详细了,这里我只是结合我的实际使 ...

  5. Android之人脸识别

    **前言** 人工智能时代快速来临,其中人脸识别是当前比较热门的技术,在国内也越来越多的运用,例如刷脸打卡.刷脸App,身份识别,人脸门禁等等.当前的人脸识别技术分为WEBAPI和SDK调用两种法方式 ...

  6. 学习笔记78—三大统计相关系数:Pearson、Spearman秩相关系数、kendall等级相关系数

    ****************************************************** 如有谬误,请联系指正.转载请注明出处. 联系方式: e-mail: heyi9069@gm ...

  7. windows,用c++调用mxnet做前向

    参考博客: https://blog.csdn.net/qq_34062105/article/details/82590553 https://blog.csdn.net/u012234115/ar ...

  8. 用Python实现支持向量机并处理Iris数据集

    SVM全称是Support Vector Machine,即支持向量机,是一种监督式学习算法.它主要应用于分类问题,通过改进代码也可以用作回归.所谓支持向量就是距离分隔面最近的向量.支持向量机就是要确 ...

  9. web前端常见面试题

    转载自:https://www.cnblogs.com/jj-z/p/7999538.html 一.理论知识 1.1.讲讲输入完网址按下回车,到看到网页这个过程中发生了什么 a. 域名解析 b. 发起 ...

  10. 强力推荐!那些你不能错过的 GitHub 插件和工具

    以代码托管平台起家的 GitHub 网站,已然成为全球程序员工作和生活中不可或缺的一份子.从优秀的企业,到优秀的程序员,都将自己最优秀的代码作品存放在这片开源净土里,供彼此学习交流.\\LS--201 ...