Go 的第一个爬虫

[[Go]] Web Crawler Go 的第一个爬虫 使用 Go 实现了第一个爬虫,只使用了标准模块,无第三方模块。整体难度较低,获取 http.cat 里所有猫的照片,先从入口进入,正则匹配相关图片的 url,然后通过 file.Write 实现内容的下载,在整个过程中,使用了 http、bytes、ioutil、os、regexp 等模块,对 Go 的文件模块、路径模块和正则模块有了简单的了解。 定义结构体,保存数据 var base_url = "https://http.cat" type cat struct { // 一个结构体代表一个爬取项目 name, url string } 爬取页面代码 func httpGet(url string) (data []byte, statusCode int) { // get 请求从 url 拿数据,返回 []byte, status code fmt.Printf("date:%s\turl:%s\n", time.Now(), url) resp, err := http.Get(url) if err != nil { statusCode = -100 return data, statusCode } defer resp.Body.Close() data, err = ioutil.ReadAll(resp.Body) if err != nil { statusCode = -200 return data, statusCode } statusCode = resp.StatusCode return data, statusCode } 直接返回 []byte 是方便外部处理更方便。可以直接写入,或者 string([]byte) 转换为字符串。 正则拿到 url func regexParse(data string) []cat { // 从爬虫结果中通过正则提取所有目标数据的 name 和 url imageExp := regexp.MustCompile(`\((/images/\d{3}.jpg)\)"></div><div class="Thumbnail_content__2eR9q"><div class="Thumbnail_title__2iqYK">(\d{3})</div><p>([\w-´ ]*)`) res := make([]cat, 0) tds := imageExp.FindAllStringSubmatch(data, 100) for _, value := range tds { var buffer1 bytes.Buffer var buffer2 bytes.Buffer buffer1.WriteString(value[2]) buffer1.WriteString("_") buffer1.WriteString(value[3]) name := buffer1.String() buffer2.WriteString(base_url) buffer2.WriteString(value[1]) url := buffer2.String() res = append(res, cat{name, url}) } return res } 通过 bytes.Buffer 实现字符串的拼接,还有其他几种拼接方案。正则通过 regular expressions 101 测试。 ...

scrapy框架初使用及爬取LOL信息

Python [[Web Crawler]] scrapy 框架初使用及爬取 LOL 信息 零、真前言 这篇文章是由 2018 年 4 月 16 日首次发布于 csdn,后来由于 “逃离csdn” 的想法中,将之前发布的文章重新排版,发表在个站中。 一、前言 了解到爬虫技术大概有 18 个月了,这期间自己写过几个爬虫,也 fork 过几个流行的爬虫 repo,包括 bilibili-user、iquery、WechatSogou 等,但一直没系统的写过爬虫,上一次心血来潮(17 年 10 月),想要爬下关于英雄联盟的数据,主要想获得皮肤原画数据。 当时决定的目标网站是英雄联盟中文官网,数据准确且更新快。LOL 数据库,但苦于该网页全篇使用 js 载入数据,无法直接读取,就退而求其次,改变目标网址多玩-英雄联盟-英雄数据库。 技术使用混杂,主要利用 requests+bs4 完成爬取,部分内容使用 scrapy 抓取,逻辑结构混乱,代码可见 spider-on-lol/v1.0/,功能基本实现,但不够美。七天之前,看到了这些代码,决定用 scrapy 重新实现功能,完成整个逻辑设计,这中间遇到了很多问题,从中得到了学习,完整代码可见 spider-on-lol。 二、爬虫设计全思路 目标网站:LOL 数据库 爬取内容: 英雄姓名 英雄头像 物品名称、id 物品图片 英雄皮肤原画 英雄背景故事 技术:scrapy,splash,docker 难点 图片获取 js 页面数据的获取 中文编码 三、环境搭建 工欲善其事,必先利其器。 1、 开发语言:python v3.6.5 2、开发语言环境:anaconda v1.6.9 (非必须,但隔离环境是一个好习惯) 3、docker 安装 deepin 下安装 docker 其他系统安装 docker 4、splash 安装方法 5、一些第三方库: scrapy:conda install Scrapy scrapy_splash: conda install scrapy_splash 四、什么是 Scrapy?什么是 Splash? 1、Scrapy Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。 ...

scrapy框架初使用及爬取LOL信息

Python Web Crawler Scrapy with bilibili 一、前言 在一个月前,我写了一篇scrapy 框架初使用及爬取 LOL 信息记录了爬取 lol.qq.com 获取英雄联盟数据及英雄皮肤原画的过程。第一次使用 scrapy 后,了解了大致的爬取流程,但在细节上(例如防 ban 策略,奇怪数据处理)没太在意,处于编码第一阶段(能跑就行)。 中间学了半个月的 Qt5 和 pygame,(没学出个什么样子,了解了大致概念,翻指南能上手了),之后,看到 github 中早期 fork 了一个库,airingursb 写的bilibili-user,深有所悟,在此先感谢他的源码及他的开源精神。 但最近一段时间,BiliBili 的网站结构有了些许的变化,我就尝试着用 scrapy 重写这个功能,以只修改 item 的方式保证这个爬虫的生命(理论上,更换 item 对应的 xpath 位置就可以应对页面元素更改)。并在此基础上增加一些防 ban 策略,深化对爬虫的编写能力,以及应对可能过大的数据处理任务(单纯的构造 url,截止 5 月 3 日,b 站已经有了 323000449 账号详情界面,之前的 lol 爬虫上千条数据就把路由器撑爆了,这次可能要应付 3 亿条数据)。完整代码可见bilibili-user-scrapy 二、爬虫设计全思路 1、目标网站 账户详情页 2、爬取内容: uid 用户id,int mid 用户id,str name 用户姓名,str sex 用户性别,str regtime 用户注册时间,str birthday 用户生日,str place 用户住址,str fans 用户粉丝数,int attention 用户关注数,int level 用户等级,int 3、技术:scrapy,splash,docker,mysql 4、难点 数据库设计及数据插入 js 页面数据的获取 特殊数据的处理 防 ban 策略 三、环境搭建 1、开发语言:python v3.6.5 2、开发语言环境:anaconda v1.6.9 (非必须,但这是一个好习惯) 3、docker 安装 deepin 下安装 docker 其他系统安装 docker ...