Python之爬虫小例子

概述

不知从何时起,Python和爬虫就如初恋一般,情不知所起,一往而深,相信很多朋友学习Python,都是从爬虫开始,其实究其原因,不外两方面:其一Python对爬虫的支持度比较好,类库众多。其二Pyhton的语法简单,入门容易。所以两者形影相随,不离不弃,本文主要以一个简单的小例子,简述Python在爬虫方面的简单应用,仅供学习分享使用,如有不足之处,还请指正。

涉及知识点

本例主要爬取51job发布的工作职位,用到的知识点如下:

  • 开发环境及工具:主要用到Python3.7 ,IDE为PyCharm
  • requests类库:本类库封装了python的内置模块,主要用于网络的请求和获取数据,可以支持不同形式的请求。
  • BeautifulSoup库:主要用于解析获取的数据,包括Html,Xml,Json等不同的格式。
  • 数据持久化:主要是将内存中的数据,保存到数据库或者文件中。

爬虫的基本步骤

爬虫的基本步骤,如下图所示:

 

 

爬取目标

如有要爬取相关内容,首先要对爬取的目标进行分析,了解其目录结构,才能进行解析。本例主要爬取51job中的工作列表,如下所示:

核心源码

1.获取数据

定义一个函数get_data,用于发起请求并获取数据,如下所示:

headers中的User-Agent主要用于模拟浏览器,不然会被反爬虫程序屏蔽,http状态码为418,意思是被网站的反爬程序返回的。

encoding是要爬取的网站的编码为gbk,如果不加,会产生乱码,默认为utf-8

 1 def get_data(req_url):
 2     """获取数据"""
 3     headers = {
 4         'User-Agent': Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko', 5         Accept-Languagezh-Hans-CN,zh-Hans;q=0.5'
 6     }
 7     resp = requests.get(req_url,headers=headers)
 8     resp.encoding = gbk'  # 不加会产生中文乱码
 9     if resp.status_code == 200:
10         return resp.text
11     else12         return None

 

2.解析数据

定义一个函数parse_data,用于解析获取到的内容,如下所示:

 

采用BeautifulSoup,将返回的文本,解析成html对象,并获取对应的内容。本例主要获取工作的列表

 parse_data(resp_html):
解析数据,并返回列表 3     soup = BeautifulSoup(resp_html,features=html.parser)
 4     job_table = soup.find(div',attrs={classdw_table})
 5      print(job_table)
 6     job_list = job_table.find_all(el 7      print(job_list)
 8      循环列表,去掉第一个title和最后一个
 9     res_list = []
10     for job in job_list[1: -1]:
11         job_name = job.find(p"t1"}).find(span').find(a).get_text()
12         job_name = job_name.replace(\r\n'').strip()
13         job_company = job.find(t214         job_addr = job.find(t3"}).get_text()
15         job_salary = job.find(t416         job_time = job.find(t517          print('工作信息:',job_name,'---',job_company,job_addr,job_salary,job_time)
18         res_item =19             工作名称: job_name,1)">20             公司: job_company,1)">21             工作地址: job_addr,1)">22             薪资水平: job_salary,1)">23             发布时间: job_time
24         }
25         res_list.append(res_item)
26     return res_list

3.保存数据

定义一个函数save_data,用于将获取到的内容保存到json文件中,如下所示:

with函数 可以自动进行释放。因包含中文,所以json文件的编码为utf-8,否则会出现乱码

1  save_data(res_list):
2     保存数据3     with open(jobs.jsonwutf-8) as f:
4         res_list_json = json.dumps(res_list,ensure_ascii=False)
5         f.write(res_list_json)

4.整体调用步骤

依次调用定义的三个函数,如下所示:

if __name__ == __main__如果是主程序自己调用 3     req_url = https://search.51job.com/list/040000,000000,0000,00,9,99,java,2,1.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare= 4      获取数据
 5     resp_html = get_data(req_url)
 6      print(html)
 解析数据
 8     res_list = parse_data(resp_html)
 保存数据
10     save_data(res_list)

爬取结果展示

爬取的结果保存在jobs.json文件中,如下所示:

  1 [
  2   {
  3     ": Java架构师  4     深圳市钻木信息技术有限公司  5     深圳-福田区  6     1.8-3万/月  7     06-13"
  8   },1)">  9  10     Java实习生 6k起 11     深圳市智玩创新科技有限公司 12      13     6-8千/月 14      15  16  17     Java实习生6k起 18     深圳市康姆达科技有限公司 19     深圳-南山区 20      21      22  23  24     Java开发工程师 25     深圳市网新新思软件有限公司 26      27     1.5-1.7万/月 28      29  30  31      32     深圳市睿服科技有限公司 33      34     1.3-1.7万/月 35      36  37  38     Java开发经理 39     深圳市聚惠企业登记代理有限公司 40     深圳-龙华新区 41     1-3万/月 42      43  44  45     高级JAVA 46     深圳易加油信息科技有限公司 47      48     1.5-2.1万/月 49      50  51  52     Java高级开发工程师 53     深圳市绿联科技有限公司 54      55     2-3万/月 56      57  58  59      60     深圳市博悦科创科技有限公司 61      62     1-1.5万/月 63      64  65  66      67     易普森智慧健康科技(深圳)有限公... 68     深圳 69     1.5-2.5万/月 70      71  72  73      74     深圳易世通达科技有限公司 75      76     1.2-1.8万/月 77      78  79  80      81     苏州今融加科技有限公司 82      83     1.5-2万/月 84      85  86  87     Java后端开发工程师 88     深圳市长隆科技有限公司 89     深圳-龙岗区 90      91      92  93  94      95     深圳市元诺智能系统有限公司 96      97      98      99 100 101     java 有物流类经验102     深圳市欧恩德技术有限公司103     深圳-罗湖区104     0.8-1.1万/月105     106 107 108     Java开发工程师-2020校园招聘109     金蝶软件(中国)有限公司110     111     0.8-1.6万/月112     113 114 115     116     丰疆智能科技股份有限公司117     118     2.5-3万/月119     120 121 122     JAVA软件开发工程师123     深圳市吉星时代科技有限公司124     125     126     127 128 129     JAVA 高级软件工程师130     相通网络技术有限公司131     132     1.5-3万/月133     134 135 136     JAVA开发工程师(接受应届生)137     深圳市智岩科技有限公司138     139     0.8-1万/月140     141 142 143     Java后台开发工程师144     深圳市炬驰科技发展有限公司145     146     147     148 149 150     151     深圳市韶音科技有限公司152     深圳-宝安区153     154     155 156 157     JAVA 开发工程师158     深圳市优博讯科技股份有限公司159     160     161     162 163 164     165     深圳市有豆科技有限公司166     167     168     169 170 171     Saas平台架构师(Java方向)172     深圳市智布互联纺织科技有限公司173     174     1.7-2.5万/月175     176 177 178     Java开发实习生179     云软科技180     181     6-9千/月182     183 184 185     186     深圳市阿尔法智汇科技有限公司187     188     2-4万/月189     190 191 192     Java 全栈开发工程师193     深圳市杰纳斯科技有限公司194     195     1-3.5万/月196     197 198 199     中高级java工程师200     北京联创智融信息技术有限公司201     202     1.3-1.8万/月203     204 205 206     207     得实信息科技(深圳)有限公司208     209     0.6-1万/月210     211 212 213     214     深圳市联创科技集团有限公司215     216     217     218 219 220     中级JAVA(J13824)221     银雁科技服务集团股份有限公司222     223     224     225 226 227     java工程师228     深圳市安思疆科技有限公司229     230     231     232 233 234     JAVA 高级开发工程师235     汇才保险代理(深圳)有限公司236     237     238     239 240 241     Java高级开发工程师(直连)242     深圳市天泰国际航空旅行社有限公司...243     244     245     246 247 248     JAVA工程师249     深圳市开度贸易有限公司250     251     0.8-1.2万/月252     253 254 255     后台开发Leader(JAVA方向)256     深圳金世纪保险经纪有限公司257     258     3-4万/月259     260 261 262     263     深圳市中深力人力资源管理有限公司...264     265     266     267 268 269     270     研祥高科技控股集团有限公司271     深圳-光明新区272     0.9-1.8万/月273     274 275 276     Java(证券不加班)277     上海华腾软件系统有限公司278     279     1.8-2.2万/月280     281 282 283     284     深圳大美商业地产管理有限公司285     286     287     288 289 290     资深/高级Java工程师291     未来穿戴(深圳)有限公司292     293     294     295 296 297     298     深圳市太阳星通信科技有限公司299     300     0.8-1.5万/月301     302 303 304     305     深圳市蓝鹰立德软件咨询有限公司306     307     1.5-1.8万/月308     309 310 311     JAVA(高级、架构)312     深圳市几米物联有限公司313     314     2.2-3.2万/月315     316 317 318     JAVA开发工程师319     江苏康尚生物医疗科技有限公司320     321     322     323 324 325     java架构师326     深圳市泓齐网络科技有限公司327     328     329     330 331 332     333     深圳市智璟科技有限公司334     335     0.9-1.5万/月336     337 338 339     340     上海舟恩信息技术有限公司341     342     1.4-1.9万/月343     344   }
345 ]
View Code

进一步思考

 

本例可以进一步优化的空间,如下所示:

  • 本次爬虫只是单次爬取,数据量相对小,如果要爬取大量数据的时候,则需要使用多线程相关的知识。
  • 基础的爬虫,只能爬取静态渲染的内容,如果是异步动态渲染的数据,如何爬取呢?
  • 将爬取的结果保存到数据库如何操作呢?

备注

芙蓉楼送辛渐
[唐]王昌龄
寒雨连江夜入吴,平明送客楚山孤。
洛阳亲友如相问,一片冰心在玉壶。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Python中的函数(二) 在上一篇文章中提到了Python中函数的定义和使用,在这篇文章里我们来讨论下关于函数的一些更深的话题。在学习C语言函数的时候,遇到的问题主要有形参实参的区别、参数的传递和改变、变量的作用域。同样在Python中,关于对函数的理解和使用也存在这些问题。下面来逐一讲解。一.函
Python中的字符串 可能大多数人在学习C语言的时候,最先接触的数据类型就是字符串,因为大多教程都是以"Hello world"这个程序作为入门程序,这个程序中要打印的"Hello world"就是字符串。如果你做过自然语言处理方面的研究,并且用Python
Python 面向对象编程(一) 虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程。下面就来了解一下如何在Python中进行对象编程。一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法。 类是对现实世界中一些事物的封装,
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定义和使用方法,这只体现了面向对象编程的三大特点之一:封装。下面就来了解一下另外两大特征:继承和多态。 在Python中,如果需要的话,可以让一个类去继承一个类,被继承的类称为父类或者超类、也可以称作基类,继承的类称为子类。并且Pytho
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非常熟悉,无论在哪门编程语言当中,函数(当然在某些语言里称作方法,意义是相同的)都扮演着至关重要的角色。今天就来了解一下Python中的函数用法。一.函数的定义 在某些编程语言当中,函数声明和函数定义是区分开的(在这些编程语言当中函数声明
在windows下如何快速搭建web.py开发框架 用Python进行web开发的话有很多框架供选择,比如最出名的Django,tornado等,除了这些框架之外,有一个轻量级的框架使用起来也是非常方便和顺手,就是web.py。它由一名黑客所创建,但是不幸的是这位创建者于2013年自杀了。据说现在由
将Sublime Text 2搭建成一个好用的IDE 说起编辑器,可能大部分人要推荐的是Vim和Emacs,本人用过Vim,功能确实强大,但是不是很习惯,之前一直有朋友推荐SUblime Text 2这款编辑器,然后这段时间就试了一下,就深深地喜欢上这款编辑器了...
Python中的模块 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt这个函数,必须用语句"#include<math.h>"引入math.h这个头文件,否则是无法正常进行调用的。那么在Python中,如果要引用一些内置的函数,该怎么处理呢?在Python中
Python的基础语法 在对Python有了基础的认识之后,下面来了解一下Python的基础语法,看看它和C语言、java之间的基础语法差异。一.变量、表达式和语句 Python中的语句也称作命令,比如print "hello python"这就是一条语句。 表达式,顾名思义,是
Eclipse+PyDevʽjango+Mysql搭建Python web开发环境 Python的web框架有很多,目前主流的有Django、Tornado、Web.py等,最流行的要属Django了,也是被大家最看好的框架之一。下面就来讲讲如何搭建Django的开发环境。一.准备工作 需要下载的
在windows下安装配置Ulipad 今天推荐一款轻便的文本编辑器Ulipad,用来写一些小的Python脚本非常方便。 Ulipad下载地址: https://github.com/limodou/ulipad http://files.cnblogs.com/dolphin0520/u...
Python中的函数(三) 在前面两篇文章中已经探讨了函数的一些相关用法,下面一起来了解一下函数参数类型的问题。在C语言中,调用函数时必须依照函数定义时的参数个数以及类型来传递参数,否则将会发生错误,这个是严格进行规定的。然而在Python中函数参数定义和传递的方式相比而言就灵活多了。一.函数参数的
在Notepad++中搭配Python开发环境 Python在最近几年一度成为最流行的语言之一,不仅仅是因为它简洁明了,更在于它的功能之强大。它不仅能够完成一般脚本语言所能做的事情,还能很方便快捷地进行大规模的项目开发。在学习Python之前我们来看一下Python的历史由来,"Pytho
Python中的条件选择和循环语句 同C语言、Java一样,Python中也存在条件选择和循环语句,其风格和C语言、java的很类似,但是在写法和用法上还是有一些区别。今天就让我们一起来了解一下。一.条件选择语句 Python中条件选择语句的关键字为:if 、elif 、else这三个。其基本形式如
关于raw_input( )和sys.stdin.readline( )的区别 之前一直认为用raw_input( )和sys.stdin.readline( )来获取输入的效果完全相同,但是最近在写程序时有类似这样一段代码:import sysline = sys.stdin.readline()
初识Python 跟学习所有的编程语言一样,首先得了解这门语言的编程风格和最基础的语法。下面就让我们一起来了解一下Python的编程风格。1.逻辑行与物理行 在Python中有逻辑行和物理行这个概念,物理行是指在编辑器中实际看到的一行,逻辑行是指一条Python语句。在Python中提倡一个物理行只
当我们的代码是有访问网络相关的操作时,比如http请求或者访问远程数据库,经常可能会发生一些错误,有些错误可能重新去发送请求就会成功,本文分析常见可能需要重试的场景,并最后给出python代码实现。
1.经典迭代器 2.将Sentence中的__iter__改成生成器函数 改成生成器后用法不变,但更加简洁。 3.惰性实现 当列表比较大,占内存较大时,我们可以采用惰性实现,每次只读取一个元素到内存。 或者使用更简洁的生成器表达式 4.yield from itertools模块含有大量生成器函数可
本文介绍简单介绍socket的常用函数,并以python-kafka中的源码socketpair为例,来讲解python socket的运用
python实践中经常出现编码相关的异常,大多网上找资料而没有理解原理,导致一次次重复错误。本文对常用Unicode、UTF-8、GB2312编码的原理进行介绍,接着介绍了python字符类型unicode和str以及常见编解码错误UnicodeEncodeError和UnicodeDEcodeEr