网络收集(网络爬虫和数据收集)
无论是数据分析、数据建模,甚至是数据挖掘,在做这些高层次的工作之前,都要先收集数据。数据是数据工作的基础,没有数据,挖掘就没有意义。俗话说,聪明的女人离不开米饭,接下来我们就来说说爬行动物。
爬虫是收集外部数据的重要方式。常用于竞争分析,也用于爬虫自身业务。比如搜索引擎就是爬虫的最高应用。当然爬虫不能肆无忌惮。如果你不小心,你可能会成为面向监狱的编程。
1.什么是爬行动物?
爬虫,一般针对特定的网站或App,通过爬虫脚本或程序从指定的页面收集数据。它指的是通过编程向web服务器请求数据(HTML形式),然后解析HTML提取你想要的数据。
一般来说,爬虫需要掌握一门编程语言。要了解HTML、web服务器、数据库等知识,建议从python开始,有很多第三方类库可以快速方便的抓取网页。
二、如何进行网络爬虫
1.先分析网页。
按F12调出网页调试界面,在Element标签下可以看到对应的HTML代码。这些其实是网页的代码。通过解析源代码(如hmtl)可以看到网页是如何加载和呈现的,就像你穿着衣服一样(手动滑稽)。
我们可以找到网页元素。左上角有一个小按钮。点击它,然后在网页上找到你想要定位的地方,你可以直接在这里定位源代码,如下图所示:
我们可以修改源代码,把【python】改成【我是帅哥】。嘿,网页上会有不同的变化。以上主要用于科普,这一块主要是前端工程师领域。你看到的地方都是前端的辛苦,冰山下的地方都是后端工程师的地盘。
有点跑题了。回到主题,网页已经分析过了,可以定位想要爬的元素内容。接下来可以换包写爬虫脚本,可以爬基本网页上能看到的东西,看到的就是得到的。
2.程序如何访问网页?
您可以单击“网络”按钮,查看当我们在浏览器搜索输入框中输入关键字时python经历了什么。涉及的专业内容可能过于复杂。大家感觉可能是我输入了一个关键词,网页给我返回了很多内容。其实在中间,本地客户端向服务器发送了get请求,服务器在中间通过了TCP的三次握手,挥舞了四次,网络安全,加密等。,最后将内容安全地返回到您的本地客户端。你有没有觉得头变大了一点?为了开心上网,工程师真的不
了解这些内容将有助于我们理解爬虫的机制。简单来说,就是模拟一个人登录网页,请求访问,找到返回的网页内容并下载数据的程序。刚才说到网页网络的内容,常见的请求有两种:get请求和POST请求。GET请求在URL上公开请求参数,而POST请求参数放在请求体中。post request方法还对密码参数进行加密,相对安全。
为了模拟访问的请求头,当我们发出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()