1、通过http.Get()方法拿到HTML页面文本
-中文乱码问题:“珍爱网”是GBK的编码,需要把文本转换成UTF-8编码【利用golang.org/x/text包转换Reader为UTF8格式】
-如何自动探查网页文本的编码格式【利用golang.org/x/net/html包下的charset.DeterminEncoding函数】
2、使用正则表达式获取城市列表
-正则表达式基础,如何匹配邮件地址【`[A-Za-z0-9]+@[A-Za-z0-9]+\.[A-Za-z0-9.]+`】
3、程序架构设计
-城市列表解析器、城市解析器、用户解析器 【抽象出解析器Parser:输入html文本,输出Request{url, parser}列表和data列表】
-起始页面以及待爬取页面【种子Seed,Request类型】
-获取页面内容【抓取机Fetcher:输入URL,输出文本】
-保持一个任务队列
-设计引擎驱动并关联所有的动作【引擎Engine:从Seed处获取页面,插入到任务队列;从队列中取出任务,交给Fetcher抓取内容;把内容送到Parser解析】
4、实现城市列表解析器和引擎
-从城市列表的页面文本中找到所有的城市名称和对应的访问链接
-要解析的字符串大概长这个样子:<a href="http://www.zhenai.com/zhenghun/luoyang" data-v-5e16505f>洛阳</a>
-构造正则表达式:`<a href="(http://www.zhenai.com/zhenghun/[a-z0-9]+)"[^>]*>([^<]+)</a>`
-将步骤2的代码封装成ParseCityList(contens []byte) engine.ParseResult函数,将分析好的字段放到结果里
-engine文件夹下的结构体文件types.go【Request{url,ParseFunc}, ParseResult{requests, Items}】
-engine文件夹下的动作执行文件engine.go【实现Run(seeds ...Request)函数】
5、测试城市列表解析器
-go的测试的写法
6、实现城市解析器
-从某个城市的页面文本中找到该城市下所有的用户名和对应的访问链接
-构造正则表达式:`<a href="(http://album.zhenai.com/u/[0-9]+)"[^>]*>([^<]+)</a>`
-代码逻辑与城市列表解析器一致
7、实现用户信息解析器
-珍爱网对用户页面的直接爬取做了限制(403),需要在http请求的头部添加User-Agent字段,模拟浏览器的访问
-构造正则表达式1提取用户主要信息:`<div class="des f-cl" data-v-3c42fade>([^\s]+)\s\|\s([0-9]+)岁\s\|\s([^\s]+)\s\|\s([^\s]+)\s\|\s([0-9]+)cm\s\|\s([^<]+)</div>`
-由于在城市解析器中已经获取了用户名,从上层传递到此处