网络爬虫
模拟浏览器发送请求
获取数据
爬虫用途
1.呈现数据,呈现在app或者网站上
2.进行数据分析,获得结论
爬虫分类
1.通用爬虫: 搜索引擎的爬虫
2.聚焦爬虫: 针对特定网站的爬虫
聚焦爬虫的工作流程
1.明确url: 请求地址,明确爬什么
2.发送请求: 获取响应数据
3.保存响应数据: 提取有用的信息
4.处理数据
爬虫爬取哪些数据
1.咨询公司: 特定领域的新闻数据
2.金融公司: 关于各个公司的动态信息
3.酒店旅游: 酒店价格,机票信息等
4.房地产: 房地产门户楼盘信息,政府动态
5:保健医药: 医疗数据价格,市场信息
写一下
1.明确url
2.发送请求
3.获取数据,提取数据
4.处理数据,保存
新建一个go
我们请求一下海贼王贴吧数据
https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&ie=utf-8&pn=0
func main() {
start(1, 5)
}
func start(start int, end int) {
for i := start; i <= end; i++ {
//拼接url
url := "https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&ie=utf-8&pn=" + strconv.Itoa(50*(i-1))
//使用get方法请求
resp, err := http.Get(url)
if err != nil {
fmt.Println("请求失败...", err)
continue
}
defer resp.Body.Close()
//读取resp.body响应体
bytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("读取失败...", err)
continue
}
//拼接文件名
filename := "f:/test/第" + strconv.Itoa(i) + "页.txt"
//将数据写入到文件里
writeErr := ioutil.WriteFile(filename, bytes, 0666)
if writeErr != nil {
fmt.Println("写入失败...", writeErr)
continue
}
fmt.Println("第", i, "页爬取成功...")
}
}
我们修改一下
改成go程并发的爬虫
var channel = make(chan bool)
func main() {
start(1, 20)
}
func start(start int, end int) {
for i := start; i <= end; i++ {
url := "https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&ie=utf-8&pn=" + strconv.Itoa(50*(i-1))
filename := "f:/test/第" + strconv.Itoa(i) + "页.txt"
go spider(i, url, filename)
}
for i := start; i <= end; i++ {
<-channel
}
}
func spider(i int, url string, filename string) {
defer stop(i)
resp, err := http.Get(url)
if err != nil {
fmt.Println("请求失败...", err)
return
}
defer resp.Body.Close()
bytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("读取失败...", err)
return
}
writeErr := ioutil.WriteFile(filename, bytes, 0666)
if writeErr != nil {
fmt.Println("写入失败...", err)
return
}
}
func stop(i int) {
fmt.Println("成功", i)
channel <- true
}