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

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

例子2:

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

把网页结构解析成一个结构树对象,找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























![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)