简单的Go语言爬虫与Python爬虫例子对比(20) | Go主题月

爬虫原理

自己经常会使用Python写一些爬虫,自己学习Go语言也有一段时间了,想使用Go语言来做一个爬虫脚本试试,看看两种语言的差别。
先找一个目标 自己最开始学Python爬虫的时候爬过一个网站 心灵毒鸡汤

image.png
采用一个简单的反爬,随机的标签:
例子1:

image.png
例子2:
image.png

简单说一下爬虫的基本原理,就是找网页的规律,我们要获取文字内容都是section标签下面的div下的子标签的文字内容,div的id和class都是动态的,子标签的类型也是随机的。python的网页爬虫常用的有三种方法,1.正则表达,2.xpath 3.bs4。这里我们用最后一个比较简单容易上手,类似于jquery,找class,找id找其中的层级关系。
核心代码:
image.png

把网页结构解析成一个结构树对象,找section标签找下面的div找下面的子标签 。

python

Python完整代码:

# -*- coding: utf-8 -*-


import requests
import pymysql
from bs4 import BeautifulSoup

test_url = 'https://www.nihaowua.com/home.html'


# 数据库连接操作
def connect_wxremit_db():
    return pymysql.connect(host='127.0.0.1',  # 填自己mysql的地址
                           port=3306,
                           user='root',  # mysql帐号
                           password='123456',  # mysql密码
                           database='test',
                           charset='utf8')


def download_page(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
    }
    data = requests.get(url, headers=headers).content  # 请求目标网址
    return data


def parse_html(html):
    result = ""
    soup = BeautifulSoup(html, "html.parser")  # 解析目标网址
    list_soup = soup.find('section').find('div').children  # 找到目标内容
    if list_soup != None:
        for i in list_soup:
            result += i.string
    return result


def main():
    db = connect_wxremit_db()
    cursor = db.cursor()  # 创建数据库游标
    while True:
        try:
            handle = parse_html(download_page(test_url))  # 得到目标数据
            if handle != None:
                print(handle)
                sql = "INSERT INTO chicken(word) VALUES ('%s')" % (
                    handle)  # 数据库插入语句
                cursor.execute(sql)  # 提交数据库操作
                db.commit()
        except:
            pass
    db.close()

if __name__ == '__main__':
    main()

复制代码

Go语言

不到60行代码实现了爬虫解析网页数据入库的操作,数据库相关字段做了唯一约束,当然这篇文章是学习用Go语言,要用Go语言实现这个爬虫,直接亮代码:

package main

import (
	"database/sql"
	"fmt"
	"log"
	"net/http"

	"github.com/PuerkitoBio/goquery"
	_ "github.com/go-sql-driver/mysql"
)

func main() {
	sql_connect := "root:123456@tcp(127.0.0.1:3306)/test"
	db, err := sql.Open("mysql", sql_connect)
	if err != nil {
		panic(err)
	}
	defer db.Close()

	for {
		resp, err := http.Get("https://www.nihaowua.com/home.html")
		if err != nil {
			log.Fatal(err)
		}
		defer resp.Body.Close()
		doc, err := goquery.NewDocumentFromReader(resp.Body)
		if err != nil {
			fmt.Printf("解析错误%s", err)
		}
		doc.Find("section div").Each(func(i int, s *goquery.Selection) {
			word := s.Text()
			fmt.Printf("Review : %s \n", word)
			sqlstr := "INSERT INTO chicken(word) VALUE (?)"
			ret, err := db.Exec(sqlstr, word)
			if err != nil {
				fmt.Printf("插入失败,下次继续")
			}
			fmt.Printf("成功插入:%d\n", ret)
		})
	}
}

复制代码

总结

Go语言写的代码不到50行,旗鼓相当(原因是Python封装了几个函数),Go语言使用goquery这个包解析网页,类似与Python的bs4,http是Go语言的内置包比Python爬虫常用的第三方包requests要简陋很多,遇到数据结构复杂,请求体复杂的还是Python要简单一点。整体看起来Go语言更加严谨每一个有可能出错的地方都会有处理,还有因为HTTP请求是一个阻塞操作,使用Go语言的协程肯定会比Python的多线程快。下篇们就来了解一下Go的协程。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享