概述
不知从何时起,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°reefrom=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 ]
进一步思考
本例可以进一步优化的空间,如下所示:
- 本次爬虫只是单次爬取,数据量相对小,如果要爬取大量数据的时候,则需要使用多线程相关的知识。
- 基础的爬虫,只能爬取静态渲染的内容,如果是异步动态渲染的数据,如何爬取呢?
- 将爬取的结果保存到数据库如何操作呢?
备注
芙蓉楼送辛渐
[唐]王昌龄
寒雨连江夜入吴,平明送客楚山孤。
洛阳亲友如相问,一片冰心在玉壶。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。