网络采集(网络爬虫与数据收集)
不管是数据分析,还是数据建模乃至数据挖掘,在进行这些高大上的工作之前我们都要进行数据采集,数据是数据工作的基础,没有数据,挖掘也没有意义。俗话说,巧妇难为无米之炊,所以,接下来我们来聊下爬虫。
爬虫是采集外部数据的重要的方式。常用于竞对分析,也有将爬虫应用成自身的业务,如搜索引擎就是爬虫最高的应用。当然,爬虫也不是可以肆无忌惮的,一不小心可能就变成面向监狱式编程了。
一、什么是爬虫?
爬虫抓取,一般是针对特定的网站或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()
写在最后
最后说一句,本次文章的爬虫仅限于交流学