文档章节

go_spider 简单爬虫实现

后端刘彦祖
 后端刘彦祖
发布于 2017/04/11 12:57
字数 681
阅读 150
收藏 0

1.前情提要

作为一个根正苗红的php程序员(筑基前期的程序员),很容易不知道自己想做什么。庞大的系统搞不定,增删改查没意思。。。
在这个背景下,为了学习到php没有的特性(高性能,并发)接受到了公司老员工的火爆安利,对golang的兴趣很大。

2.代码实现

以下是完整代码     
package main

import (
	"fmt"
	"log"
	"strings"

	"github.com/PuerkitoBio/goquery"
	_ "github.com/go-sql-driver/mysql"  //载入数据库驱动
	"github.com/go-xorm/xorm"
	"github.com/hu17889/go_spider/core/common/page"
	"github.com/hu17889/go_spider/core/common/request"
	"github.com/hu17889/go_spider/core/spider"
)

const (
	rooturl = "http://www.77kp.com"  // 爬取网站的根目录
)

type Db77kp struct {
	Id    int64
	Name  string
	Xlurl string
}

var mysqluser string = "test"
var mysqlpass string = "123456"
var mysqlhost string = "127.0.0.1:3306"
var mysqlname string = "77kp"

//爬取77kp网站,获取迅雷下载地址

//- url 入口
// http://www.77kp.com/

//- 爬取 ```ul.txt-list a href ``` 获得详情页跳转地址
//- 爬取 ``` ul.downurl a href a text``` 获取该影片迅雷下载地址,并储存数据库
//- 爬取 ```ul.txt-list a href ```继续加入下载队列

type MyPageProcesser struct {
}

func NewMyPageProcesser() *MyPageProcesser {
	return &MyPageProcesser{}
}

//网页解析器
func (this *MyPageProcesser) Process(p *page.Page) {
	if !p.IsSucc() {
		println(p.Errormsg())
		return
	}

	// 连接数据库
	conn := mysqluser + ":" + mysqlpass + "@tcp(" + mysqlhost + ")/" + mysqlname + "?charset=utf8"
	engine, mysqlErr := xorm.NewEngine("mysql", conn)
	if mysqlErr != nil {
		log.Print("数据库连接失败!")
		log.Print(mysqlErr)
	}
        
	query := p.GetHtmlParser()
        
        // 获取页面上相同类型的url,准备加入待爬取页面列表
	href, _ := query.Find(".txt-list.txt-list-small a").Attr("href")
	href = strings.Trim(href, "\t\n")
        
        // 爬取当前页面是哪部电视剧的名称
	name := query.Find(".detail-title h2").Text()
	name = strings.Trim(name, " \t\n")

	//	var durlMap map[int]string

        // 循环爬取页面中迅雷下载地址和剧集名称,并存入数据库中
	query.Find(".downurl .dwon_xl a").Each(func(i int, s *goquery.Selection) {
		dramaName, _ := s.Attr("title")
		downurl, _ := s.Attr("href")
		_, errins := engine.Query("INSERT INTO `77kp` (`name`, `xlurl`) VALUES ('" + dramaName + "', '" + downurl + "')")
		if errins != nil {
			log.Print("插入数据库失败!")
			log.Print(errins.Error())
		}
		fmt.Println("剧集名称:" + dramaName)
		fmt.Println("剧集下载地址:" + downurl)
		fmt.Println("插入数据库成功!")
	})

        // 将待爬取的链接加入爬取列表中
	addRequest(p, "77kp", rooturl+href, "", "")

	fmt.Printf("页面名称:%v \n 页面路由:%v \n", name, href)
	//	p.AddField("summary", summary)
	//	p.AddField("href", href)
}

// 爬取完成方法
func (this *MyPageProcesser) Finish() {
	fmt.Printf("爬取完成! \r\n")
}

// 添加待爬取url方法
func addRequest(p *page.Page, tag, url, cookie, content string) {
	req := request.NewRequest(url, "html", tag, "GET", "", nil, nil, nil, nil)
	p.AddTargetRequestWithParams(req)
}

func main() {
	sp := spider.NewSpider(NewMyPageProcesser(), "77kp")
        // 入口地址
	req := request.NewRequest("http://www.77kp.com/vod-detail-id-5269.html", "html", "", "GET", "", nil, nil, nil, nil)
	pageItems := sp.GetByRequest(req)
	url := pageItems.GetRequest().GetUrl()
	println("url\t:\t" + url)
	//	for name, value := range pageItems.GetAll() {
	//		println(name + "\t:\t" + value)
	//	}
}

© 著作权归作者所有

后端刘彦祖
粉丝 0
博文 1
码字总数 681
作品 0
宜春
私信 提问
Go爬虫框架--go_spider

本项目基于golang开发,是一个开放的垂直领域的爬虫框架,框架中将各个功能模块区分开,方便使用者重新实现子模块,进而构建自己垂直方方向的爬虫。 本项目将爬虫的各个功能流程区分成Spide...

hucong
2014/12/01
5.8K
0
Scrapy 框架基本了解以及Spiders爬虫

Scrapy 框架基本了解以及Spiders爬虫,首先我们先了解下Scrapy 框架基本原理,然后我们用一个简单的案例来介绍Scrapy的使用。 Scrapy 框架基本了解: 1、Scrapy是用纯Python实现一个为了爬取...

博行天下
2017/11/28
0
0
爬虫入门之Scrapy框架基础框架结构及腾讯爬取(十)

Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据。 如果安装了 IPython ...

善良小郎君
2018/07/06
0
0
32个Python爬虫项目让你一次吃到撑

今天为大家整理了32个Python爬虫项目。 整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心。所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)O WechatSogou [1]- 微信公众号爬...

qq_26948675
2017/11/08
0
0
Scrapy的架构初探

Scrapy,Python开发的一个web抓取框架。 1,引言 Python即时网络爬虫启动的目标是一起把互联网变成大数据库。单纯的开放源代码并不是开源的全部,开源的核心是“开放的思想”,聚合最好的想法...

fullerhua
2016/06/12
676
4

没有更多内容

加载失败,请刷新页面

加载更多

Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
5
0
Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
6
0
hive

一、hive的定义: Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的 Hive中的表是纯逻辑表,就只是表的定义,即表的元数据。本质就是Hadoop的目...

霉男纸
今天
5
0
二、Spring Cloud—Eureka(Greenwich.SR1)

注:本系列文章所用工具及版本如下:开发工具(IDEA 2018.3.5),Spring Boot(2.1.3.RELEASE),Spring Cloud(Greenwich.SR1),Maven(3.6.0),JDK(1.8) Eureka: Eureka是Netflix开发...

倪伟伟
昨天
15
0
eclipse常用插件

amaterasUML https://takezoe.github.io/amateras-update-site/ https://github.com/takezoe/amateras-modeler modelGoon https://www.cnblogs.com/aademeng/articles/6890266.html......

大头鬼_yc
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部