比较爬虫用的语言Python与Go
Python是我比较喜欢的语言,莫名的喜欢,对Python的学习可能起初是敲错了网址开始的,哈哈哈~
工作的任务从一个网站后台做登录、爬取数据,写入服务器Redis中,同事认为我会用PHP来写,哼!让你猜到那该多没意思,于是乎有了如下Python的代码,你看50多行搞定了。
#!/usr/bin/python3
import requests
import re
import redis
from pyquery import PyQuery as pq loginUrl = 'https://manage.xxx.com.cn/home/login'
userName = 'xxx'
passWord = 'xxx' redisServer = '192.168.0.2'
redisPort = 6379
redisPass = '' productList = {'椰油':'CL_Spot','咖啡':'COFFEE','工业铜':'COPPER'}
volumeList = {'CL_Spot':[0, 0], 'COFFEE':[0, 0], 'COPPER':[0, 0]} def main():
jsessionid = getCookie()
doLogin(jsessionid)
dataUrl = 'https://manage.xxx.cn/?pageNo=1&pageSize=100'
cookies = {'JSESSIONID': jsessionid}
r = requests.get(dataUrl, cookies = cookies)
dom = pq(r.text)
lines = dom('table').eq(1).find('tr').items()
for line in lines:
line = re.sub(r'<!--.*-->', '', str(line))
pattern = re.compile(r'<td>(.*?)</td>')
group = pattern.findall(line)
if not group:
continue
productCode = productList[group[3]]
if group[6] == '买':
volumeList[productCode][0]+= int(group[7]) * int(group[8])
if group[6] == '卖':
volumeList[productCode][1]+= int(group[7]) * int(group[8]) redisClient = redis.Redis(host=redisServer, port=redisPort, password=redisPass)
for x in volumeList:
keyUp = 'redis_order_count_u_%s' % x
keyDown = 'redis_order_count_d_%s' % x
redisClient.set(keyUp, int(volumeList[x][0]))
redisClient.set(keyDown, int(volumeList[x][1])) def getCookie():
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'}
r = requests.get(loginUrl, headers = ua)
return r.cookies['JSESSIONID'] def doLogin(jsessionid):
param = {'userName': userName, 'password': passWord}
cookies = {'JSESSIONID': jsessionid}
requests.post(loginUrl, data = param, cookies = cookies) if __name__ == '__main__':
main()
另一个服务也需要这个需求,用了最近看的Golang来实现一次,瞧写了100多行
package main import (
"fmt"
"net/http"
"net/url"
"os"
"strings"
"strconv"
"gopkg.in/redis.v4"
"github.com/PuerkitoBio/goquery"
) var loginUrl string = "https://manage.xxx.com.cn/home/login"
var dataUrl string = "https://manage.xxx.com.cn/?pageNo=1&pageSize=100"
var userName string = "xxx"
var passWord string = "xxx"
var redisServer string = "192.168.1.2"
var redisPort string = ""
var redisPass string = ""
var redisDB int = 0 func main() {
productList := make(map[string] string)
productList["椰油"] = "CL_Spot"
productList["咖啡"] = "COFFEE"
productList["工业铜"] = "COPPER"
volumeList := make(map[string] int)
volumeList["u_CL_Spot"] = 0
volumeList["d_CL_Spot"] = 0
volumeList["u_COFFEE"] = 0
volumeList["d_COFFEE"] = 0
volumeList["u_COPPER"] = 0
volumeList["d_COPPER"] = 0
jsessionid := getCookie()
doLogin(jsessionid) request, err := http.NewRequest("GET", dataUrl, nil)
request.AddCookie(&http.Cookie{Name: "JSESSIONID", Value: jsessionid})
client := &http.Client{}
response, err := client.Do(request)
if err != nil {
fmt.Println(err.Error())
os.Exit(0)
}
defer response.Body.Close()
doc, err := goquery.NewDocumentFromReader(response.Body)
doc.Find("table").Eq(1).Find("tr").Each(func(i int, tr *goquery.Selection) {
td := tr.Find("td")
name := td.Eq(3).Text()
dir := td.Eq(6).Text()
if val, ok := productList[name]; ok {
buyNum, _ := strconv.Atoi(td.Eq(7).Text())
buyUnit, _ := strconv.Atoi(td.Eq(8).Text())
num := buyNum * buyUnit
cacheKey := ""
if dir == "买" {
cacheKey = fmt.Sprintf("u_%s", val)
} else if dir == "卖" {
cacheKey = fmt.Sprintf("d_%s", val)
}
volumeList[cacheKey] += num
}
})
redisClient := redis.NewClient(&redis.Options{
Addr: fmt.Sprintf("%s:%s", redisServer, redisPort),
Password: redisPass,
DB: redisDB,
})
for k, v := range volumeList {
strKey := fmt.Sprintf("redis_order_count_%s", k)
redisClient.Set(strKey, int(v), 0)
}
fmt.Println("puti volume get success")
} func getCookie() string {
jsessionid := ""
response, err := http.Get(loginUrl)
if err != nil {
fmt.Println(err.Error())
os.Exit(0)
}
defer response.Body.Close()
for _, val := range response.Cookies() {
if val.Name == "JSESSIONID" {
jsessionid = val.Value
}
}
return jsessionid
} func doLogin(jsessionid string) bool {
data := url.Values{}
data.Set("userName", userName)
data.Add("password", passWord)
request, _ := http.NewRequest("POST", loginUrl, strings.NewReader(data.Encode()))
request.Header.Add("Content-Type", "application/x-www-form-urlencoded")
request.Header.Add("Content-Length", strconv.Itoa(len(data.Encode())))
request.AddCookie(&http.Cookie{Name: "JSESSIONID", Value: jsessionid})
client := &http.Client{}
response, err := client.Do(request)
if err != nil {
fmt.Println(err.Error())
os.Exit(0)
}
defer response.Body.Close()
return true
}
Python的实现到上线半天的功夫搞定了,Go足足搞了1整天,蹩脚的语法与不熟悉的语法让我学习了很多知识点,最后Mac编译到Linux上执行也给我上了一课。
觉得入门学习这两门语言挺好,一个是脚本语言另一个是编译语言,用处都很广泛。轩轩你准备好了吗?
比较爬虫用的语言Python与Go的更多相关文章
- golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍
		
golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍 go语言爬虫框架:gocolly/colly,goquery,colly,chrom ...
 - 【Python】【爬虫】如何学习Python爬虫?
		
如何学习Python爬虫[入门篇]? 路人甲 1 年前 想写这么一篇文章,但是知乎社区爬虫大神很多,光是整理他们的答案就够我这篇文章的内容了.对于我个人来说我更喜欢那种非常实用的教程,这种教程对于想直 ...
 - 深入浅出爬虫之道: Python、Golang与GraphQuery的对比
		
深入浅出爬虫之道: Python.Golang与GraphQuery的对比 本文将分别使用 Python ,Golang 以及 GraphQuery 来解析某网站的 素材详情页面 ,这个页面的特色是具 ...
 - Python爬虫之小试牛刀——使用Python抓取百度街景图像
		
之前用.Net做过一些自动化爬虫程序,听大牛们说使用python来写爬虫更便捷,按捺不住抽空试了一把,使用Python抓取百度街景影像. 这两天,武汉迎来了一个德国总理默克尔这位大人物,又刷了一把武汉 ...
 - 基于scrapy爬虫的天气数据采集(python)
		
基于scrapy爬虫的天气数据采集(python) 一.实验介绍 1.1. 知识点 本节实验中将学习和实践以下知识点: Python基本语法 Scrapy框架 爬虫的概念 二.实验效果 三.项目实战 ...
 - python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学
		
首发于:python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=431 本文 ...
 - 决策树ID3原理及R语言python代码实现(西瓜书)
		
决策树ID3原理及R语言python代码实现(西瓜书) 摘要: 决策树是机器学习中一种非常常见的分类与回归方法,可以认为是if-else结构的规则.分类决策树是由节点和有向边组成的树形结构,节点表示特 ...
 - 浅谈爬虫 《一》 ===python
		
浅谈爬虫 <一> ===python ‘’正文之前先啰嗦一下,准确来说,在下还只是一个刚入门IT世界的菜鸟,工作近两年了,之前做前端的时候就想写博客来着,现在都转做python了,如果还 ...
 - 标准爬虫初探,来自Python之父的大餐!
		
首先不得不承认自己做了标题党.本文实质是分析500lines or less的crawlproject,这个project的地址是https://github.com/aosabook/500line ...
 
随机推荐
- Laravel用post提交表单常见的两个错误
			
最近在自学Laravel,测试用post方法提交表单时碰到两个错误: 1.获取传入的值时,报错如下图所示: 在stackFlow找答案时各种解释都有,但认真读一下报错信息,意思大概是:获取Http传入 ...
 - mac电脑php+mysql+nginx+phpmyadmin环境搭建
			
英文原文:http://blog.frd.mn/install-nginx-php-fpm-mysql-and-phpmyadmin-on-os-x-mavericks-using-homebrew/ ...
 - HDU 3565 Bi-peak Number(数位DP)题解
			
题意:我们定义每一位先严格递增(第一位不为0)后严格递减的数为峰(比如1231),一个数由两个峰组成称为双峰,一个双峰的价值为每一位位数和,问L~R双峰最大价值 思路:数位DP.显然这个问题和pos有 ...
 - Dockerfile详解及优化
			
Dockerfile详解 0. Dockerfile的作用 docker可以根据Dockerfile中的指令来构建docker镜像.Dockerfile是一个文本文件,其应当包含用户想要构建一个镜像的 ...
 - Linux常用命令——文本编辑器Vim
			
Linux常用命令--文本编辑器Vim Linux Vim常用操作 插入命令 a 在光标所在字符后插入 A 在光标所在行尾插入 i 在光标所在字符前插入 I 在光标所在行首插入 o 在光标下插入新行 ...
 - leetcode02大数相加
			
惭愧惭愧,这道题居然卡了两天,犯了一堆错误,现在一一总结 错误 头一天我看给的测试用例误以为输入是数组,做了半天也无法输出链表的正确格式,后来把输入当成链表,才正确了 我没看到编辑器给了一套链表,自己 ...
 - 从Scratch到Python——python turtle  一种比pygame更加简洁的实现
			
从Scratch到Python--python turtle 一种比pygame更加简洁的实现 现在很多学校都开设了Scratch课程,学生可以利用Scratch创作丰富的作品,然而Scratch之后 ...
 - php接口实现拖拽排序功能
			
列表拖拽排序是一个很常见的功能,但是后端接口如何处理却是一个令人纠结的问题 如何实现才能达到效率最高呢 先分析一个场景,假如有一个页面有十条数据,所谓的拖拽就是在这十条数据来来回回的拖,但是每次拖动都 ...
 - java 枚举使用教程
			
转载:https://blog.csdn.net/newbie_907486852/article/details/81027512 一.枚举型常量 首先枚举是一个特殊的class,这个class相当 ...
 - android------个人项目(歆语气象通新版)
			
歆语气象通: 歆语气象伴随你的身边,便捷生活. 包含了以下功能: 1. 天气预报数据覆盖中国城市和地区:2. 提供一周天气预报及最低最高温度,时刻关注天气,轻松计划出行:3. 各种指数详细信息,如太阳 ...