网络采集(网络爬虫与数据收集)

80酷酷网    80kuku.com

网络采集(网络爬虫与数据收集)

不管是数据分析,还是数据建模乃至数据挖掘,在进行这些高大上的工作之前我们都要进行数据采集,数据是数据工作的基础,没有数据,挖掘也没有意义。俗话说,巧妇难为无米之炊,所以,接下来我们来聊下爬虫。

爬虫是采集外部数据的重要的方式。常用于竞对分析,也有将爬虫应用成自身的业务,如搜索引擎就是爬虫最高的应用。当然,爬虫也不是可以肆无忌惮的,一不小心可能就变成面向监狱式编程了。

一、什么是爬虫?

爬虫抓取,一般是针对特定的网站或App,通过爬虫脚本或程序对指定的页面进行数据采集。是指通过编程向网络服务器请求数据(HTML表单),然后解析HTML,提取出自己想要的数据。

数据采集之爬虫篇

一般而言,爬虫需要掌握一门编程语言,要了解HTML、网络服务器、数据库等知识,建议从python入门,能快速上手爬虫,并且有很多第三方的类库,能快速方便地进行网页爬虫。

二、如何进行网页爬虫

1、先进行网页解析

数据采集之爬虫篇

按一下F12,即可调出网页调试界面,可以看到Element 标签下对应的 HTML代码,这些其实就是网页的代码,网页都是通过解析hmtl等源码,通过加载、渲染展示成大家看到的样子,就像穿了衣服化妆打扮的你(手动滑稽)。

我们可以进行网页元素的定位,左上角有个小按钮,点一下它然后在网页上找到你想定位的地方,就可以直接定位到此处的源码,如下图所示:

数据采集之爬虫篇

我们可以修改下源码看看,将定位到的源码处【python】改成【我是帅哥】,哎嘿,网页上就会发生不一样的变化。以上主要做科普作用,这块主要还是前端工程师的领域,所有大家看到的地方都是前端地辛苦付出,冰山下的都是后端工程师的地盘。

数据采集之爬虫篇

有点跑题了,回归正题,网页解析到了,可以定位到想要爬去的元素内容了,接下来就是调包写爬虫脚本,基本网页上能看到的都可以爬取,所见即所得。

2、程序如何访问网页

数据采集之爬虫篇

可以点击Network按钮,查看我们在浏览器搜索输入框输入一个关键词:python都经历了什么。涉及的专业内容可能过于复杂,大家感觉到的可能就是我输入了一个关键词,网页给我返回很多内容,其实中间是本地客户端发送一个get请求到服务器端,服务器端通过解析内容,中间经过TCP的三次握手,四次挥手,网络安全、加密等,最后安全地把内容返回到你本地的客户端上,是不是感觉头都开始有点大了,为了我们能快乐地在网络上冲浪,工程师们真的不容易~~

了解了这些内容,有助于帮助我们理解爬虫的机制。简单来说,就是一段程序,模拟人去登录网页,进行请求访问,找到返回的网页内容并把数据下载下来。刚才说到网页network的内容,常见的请求有get、post两种,GET请求把请求参数都暴露在URL上,而POST请求的参数放在request body 里面,POST请求方式还对密码参数加了密,这样就相对安全一些。

程序要模拟请求头(Request Header)进行访问,我们在做http请求的时候除了提交一些参数之外,还定义一些请求的头部信息,比如Accept、Host、cookie、User-Agent等等,主要就是将爬虫程序伪装成正规请求,获取情报内容。

数据采集之爬虫篇

爬虫就有点像间谍,打入地方内部,套取出我方想要的情报,此处不明觉厉,skr~~~

3、请求返回的接收信息

r = requests.get('https://httpbin.org/get')r.status_code//返回200r.headers{        'content-encoding': 'gzip',        'transfer-encoding': 'chunked',      'connection': 'close',        'server': 'nginx/1.0.4',        'x-runtime': '148ms',        'etag': '"e1ca502697e5c9317743dc078f67693f"',       'content-type': 'application/json'    }import requestsr = requests.get('https://api.github.com/events')r.json()// 以上操作可以算是最基本的爬虫了,返回内容如下:[{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...

通过解析返回的json字符串就可以获取到想要的数据了,恭喜~

三、python自动化爬虫实战

接下来,我们来个豆瓣电影排名的爬虫实战:

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""Created on Wed Jul 31 15:52:53 2019@author: kaluosi"""import requestsimport reimport codecsfrom bs4 import BeautifulSoupfrom openpyxl import Workbookimport pandas as pd wb = Workbook()dest_filename = '电影.xlsx'ws1 = wb.activews1.title = "电影top250"DOWNLOAD_URL = 'http://movie.douban.com/top250/'def download_page(url):    """获取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 datadef get_li(doc):    soup = BeautifulSoup(doc, 'html.parser')    ol = soup.find('ol', class_='grid_view')    name = []  # 名字    star_con = []  # 评价人数    score = []  # 评分    info_list = []  # 短评    for i in ol.find_all('li'):        detail = i.find('div', attrs={'class': 'hd'})        movie_name = detail.find('span', attrs={'class': 'title'}).get_text()  # 电影名字                level_star = i.find('span', attrs={'class': 'rating_num'}).get_text()  # 评分                star = i.find('div', attrs={'class': 'star'})        star_num = star.find(text=re.compile('评价'))  # 评价        info = i.find('span', attrs={'class': 'inq'})  # 短评        if info:  # 判断是否有短评            info_list.append(info.get_text())        else:            info_list.append('无')        score.append(level_star)        name.append(movie_name)        star_con.append(star_num)    page = soup.find('span', attrs={'class': 'next'}).find('a')  # 获取下一页    if page:        return name, star_con, score, info_list, DOWNLOAD_URL + page['href']    return name, star_con, score, info_list, Nonedef main():    url = DOWNLOAD_URL    name = []    star_con = []    score = []    info = []    while url:        doc = download_page(url)        movie, star, level_num, info_list, url = get_li(doc)        name = name + movie        star_con = star_con + star        score = score + level_num        info = info + info_list    #pandas处理数据    c = {'电影名称':name , '评论人数':star_con , '电影评分':score , '评论':info}    data = pd.DataFrame(c)    data.to_excel('豆瓣影评.xlsx')if __name__ == '__main__':    main()

写在最后

最后说一句,本次文章的爬虫仅限于交流学

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: