南京音乐推荐联合社

爬虫入门

数据工坊Datapower 2019-07-25 06:32:51


连帝都落户都对技术人员更加青睐,你还不想快到学点技术?如果要入门不如先来学学python,而爬虫更是python中非常广泛应用之一。




爬虫:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫

    —— —— 百度百科

在学python过程中,接触到了爬虫这个内容,从此一发不可收拾,本人曾经是做房地产行业数据分析的,对自己本职工作来说我利用爬虫,爬取了竞对公司网站的房源信息,及房源带看信息,用于做竞对分析。

还干过通过爬虫爬取了政府经纪人登记网站的房地产从业人员的个人信息(姓名、性别、所在门店、联系方式、交易量)给到招聘部门,用来挖人。

还干过其他一些小事,例如新房项目内容爬取等等吧。在工作之外,自己用爬虫,爬取了大众点评的美食店,做了美食地图;爬取了BOSS上的数据分析师的招聘信息,也通过此内容有方向性的去考虑换一家公司,目前已离职将要去新的平台发展(待遇提升不少),两个内容的数据可视化报告见下方url。

杭州美食地图url:https://app.powerbi.com/view?r=eyJrIjoiMDg3MzMzZjctYWE0NS00ODI4LWE2MzEtNTE2ZjBlZjI5ZGYwIiwidCI6IjYzNWE4MTA3LWUxNjEtNDJlZS1iYzk0LWY5OTdhNTMwZGExNiIsImMiOjEwfQ%3D%3D

杭州数据分析师&产品经理招聘数据url:https://app.powerbi.com/view?r=eyJrIjoiODI5MjFiNGItYWMyOS00NGRiLWEzOGMtMGRiN2MxNjkwOTA2IiwidCI6IjYzNWE4MTA3LWUxNjEtNDJlZS1iYzk0LWY5OTdhNTMwZGExNiIsImMiOjEwfQ%3D%3D

说了这么多,大概大家也能了解了爬虫是做什么的,能在实践中能做些什么,接下来将分享下我在学习爬虫中的一些笔记,如有错误或者更好的算法也请大家多多纠正和建议。

目录:

一、数据类型

二、html

三、加载需要用到的库

四、编写函数

~~~~~~~~~~~~~~~~~~正文开始~~~~~~~~~~~~~~~~~~~~~~~~

前提准备:

1.下载python及安装和配置,这个内容请大家查看这个链接,讲的很清楚。url:http://www.runoob.com/python/python-install.html

2.安装编译器,个人用的是pycharm,pycharm下载网址:https://www.jetbrains.com/zh/pycharm/specials/pycharm/pycharm.html?utm_source=baidu&utm_medium=cpc&utm_campaign=cn-bai-br-pycharm-ex-pc&utm_content=pycharm-pure&utm_term=pycharm&gclid=CJid642LltsCFQdmvAodp4II1g&gclsrc=ds&dclid=CJ7l9Y2LltsCFZR9vQod5wcInQ

3.安装包的管理器,anaconda,下载url:https://www.anaconda.com/download/

一、数据类型

工具的准备差不多了,接下来我们需要对数据类型有个大概的了解,整个爬虫过程中需要用到的类型有,整数型(int),浮点型(float),字符串(string),字典型(dict),集合(list)。

先从最简单的整数和浮点型开始:

0 1 2 3 4 5 6 7 8 9...这都是整数型,也就是int

0.1  0.2  0.3  0.4  0.5...这都是浮点型,也就是float

int和float型均可以进行数字的加减乘除运算

看到这里可能会有人说,“我靠!这用你告诉我,这不就是自然数和小数吗?还int  float整得挺高级似的!”,那我要告诉你,千万要静下心好好记住这些类别,这不仅对爬虫,对整个写代码来说都很重要。

我们继续介绍下字符串:

"1231451"

"1231wfw0/1+1W"

"我是谁?我在哪?"

这些都是字符串,你可以简单理解为有" "或者' '之间的都是字符串,在字符串中的数字不是int或者float型,也就是不能进行数字运算。字符串之间可以进行字符串的“计算”,可以进行“加法”,但不能减、乘、除

例如:

"1231oiw" + "123" = "1231oiw123",即是将两个字符串进行合并。

字典型:

dict = {key1: s1, key2: s2, key3: s3...}

字典型是一个花括号来表示的,其中内容有两部分,一个是key一个是key对的内容。

字典型的应用:dict[key2] = s2

集合:

list = [1, 2, 3, 4, 't', '6']

list中可以放int,float,string,dict,list中任何一个类型,list中的元素是有顺序的,从左自右,第一个元素对应的坐标是0,第二个是1,以此类推。。。反过来说,最后一个是-1,倒数第二个是-2,以此类推。有了坐标后,我们则可以利用坐标来对list操作。

例如:list[2] = 3     list[-2] = 't'   list[0:2] = [1, 2]   list[1:] = [2, 3, 4, 't', '6']


另外,如果你知道了list中的某个元素,想要知道其所在坐标,则这样写:list.index('t') = 4

还有,如果你要在list后边再加一个元素's',则list.append('s')

list之间也可以进行“加法”,效果类似字符串的“加法”

其实字符串可以理解为一个list,它可以进行坐标的操作和“加法”操作,但是不能进行类似append这样函数的操作,毕竟还是不同类型。

二、html

爬虫要从网页中摘取内容字段,那就需要了解网页结构,这里需要提前声明,本文章以实用为主,告诉你要怎么写,怎么用,但不会讲太多的理论知识,告诉你为什么是这样的,如果有兴趣可以留言探讨,或者自行百度深究。

我们看到的所有网址,是由向服务器发起请求,然后获取内容,再呈现出来的,而呈现的方式则是html。

比如我们看链家网的内容,用charm打开网页-右键-检查

点击对话框左上角的箭头图标

然后鼠标指的位置,就会在右侧显示对应的html内容

还有个方式就是,右键-显示源代码

在这里找到每个房源呈现内容的板块

对应

网页呈现出来的文字和数字,均在这里。

例如:

楼盘名称和售价总价

对网页结构有个大致了解后,爬虫要做的就是要把580这个总价数字爬取下来,而前边<div class="totalPrice"><span>就是针对580的标签,则我们可以用这个独一无二的标签来对580定位,进而爬取下来,其它的爬取目标内容,均是如此类比。

三、需要加载的库

库个人理解为python的工具包,利用各种各样的工具包来做对应的事情,这次爬虫的主体工具包为requests和re、multiprocessing中的Pool,还有其它辅助的库:random,time,pandas,socket。

在加载这些库之前,需要先对新建的python项目进行配置:

查找所需要的库是否都已安装好,pandas和requests需要额外安装,其它的是基本配置,不需要安装。

安装好之后,我们加载所有需要的库

import pandas as pd的意思是加载pandas库并将其命名为pd,这样是方便以后敲代码

四、编写函数

最后我们将开始写我们的爬虫主体,即函数。

我们先准备一些基本内容,1.你要爬取的网址;2.需要爬取多少页;3.需要爬取的字段如何定位;

以链家网为例,网址为:https://hz.lianjia.com/ershoufang/pg2/    其中pg2的2则代表这是第几页,因为链家网对呈现有所限制,最多呈现100页,所以我们就爬取100页的房源内容。爬取的字段定位,我们爬取房源的所在楼盘名称,房源总价,房源面积,房源单价四个内容。

房源总价:可以看到<div class="totalPrice"><span>这个标签只出现了30次,也就是每个房子只出现一次,则对每套房子来讲这个标签是唯一的,可以通过它来定位总价的位置。

房源单价:本想类似的找到单价唯一标签,但失败了,它只能定位一套房

我们缩小标签内容,发现<span>单价 可以作为标签

房源面积:我们发现可以爬取,但也可以总价/单价来计算获取,懒一下,通过计算获取吧~~~

楼盘名称:data-el="region">可以作为定位标签

最后一个是header,这个是用来将爬虫伪装成一个浏览器,这样防止被封,不同的浏览器不同的电脑对应的header不同,这边给到的是mac的charm浏览器:header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/65.0.3325.181 Safari/537.36'}

这样前边的准备内容则弄好了,我们来写到项目中。

网址url中代表页数的用{}来表示,

urls = [url.format(str(i)) for i in range(1, 101)]

urls的意思就是生成一个['https://hz.lianjia.com/ershoufang/pg1/', 'https://hz.lianjia.com/ershoufang/pg2/', ..., 'https://hz.lianjia.com/ershoufang/pg100/']的集合。

range(a, b)的意思是,取a到b-1的每一个整数,生成一个数字list

'a([\s\S]*?)b'中的a和b则代表目标字段的左右唯一标签,([\s\S]*?)可理解为目标字段,详情请参考正则表达式:

https://baike.baidu.com/item/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1700215?fr=aladdin

开始第一个函数,用于分析html,获取目标字段的函数:

函数中while的意思是,当net = False时则不断的重复进行执行下面的内容;

try和except的意思是,尝试的执行try的内容,如果当socket.timeout的时候则执行except的内容,socket.timeout的意思是,网络连接超时;

requests.get(url, headers=header),则是伪装成charm浏览器,获取该url的网址内容;

re.findall则是通过pattern标签,在res.text中找到对应的字段,re.S意思是通篇的找,后边的price、name以此类推;

生成的total、price、name都是list型,因为每页网址有30套房源,也就是会有30个total在total_list中,另外两个也是,因此我们需要将其一个一个的按照循序提取出来,每套房子成一个数据字典。因此我们运用for循环,让total,price,name循环等于各自list中的一个元素,并计算每套房子的面积(total*10000(转换单位)/单价),并保留两位小数,然后生成每套房子的字典info,再把这个字典加到一开始是空集的infos中;

time_num=random.random()是要随机生成一个随机数,time.sleep()休眠time_num长时间,这是为了每爬取一页内容的时候稍微停顿下,这样不会让服务器发现我们这边的高频请求进而发现爬虫,封死;

net = True是把net重新赋值为True,这样前边的while则停止了循环;

return则是这个函数最后将返回一个结果,就是infos的值;

第二个函数,用于多进程的执行analysis函数,一次性执行4次,也就是说一次打开四个网页进行爬取内容,大大提高爬虫效率:

Pool是一个类,需要先将其实例化,也就是将其调整好参数processes,然后赋值给pool;

pool.map(func, list)是将list中的每个元素给到func函数中进行执行,并返回一个结果,结果为list型;

得到了结果result_list后,其为list型,当中的每个元素是一页中30套房源,也就是list[list[dict], list[dict]......]这样的,因此我们需要利用for循环,并且是两层for循环将最里层的元素提取出来变成一个,两层的list集合,每个元素则是一套房子,每套房子中有其四个字段,例如list[list[name,total,price,area], list[name,total,price,area]......];

最后的for循环则是将其通过print函数打印出结果内容;

演示,为了方便我们只演示爬取10页内容,如何执行的函数不急,最后会说明:

第三个函数,保存函数,用于将我们爬取到的内容保存为csv格式:

save函数接收一个参数,infos;

先定义好字段的题头,其字段顺序和start函数最后返回的infos集合中的内容顺序一样;

pd.DataFrame是将其数据infos,转化为题头名为columns_name的dataframe型;

to_csv是将其保存下来变为csv文件,保存的路径为path,encoding则是编码为utf-8型,为了中文;

最后打印通知完成;

五、函数执行

所有的函数都已定义完成,那么如何执行函数呢,非常简单:


快去写你的爬虫吧!


Copyright © 南京音乐推荐联合社@2017