利用python爬取58同城简历数据

最近接到一个工作,需要获取58同城上面的简历信息(http://gz.58.com/qzyewu/)。最开始想到是用python里面的scrapy框架制作爬虫。但是在制作的时候,发现内容不能被存储在本地变量 response 中。当我通过shell载入网页后,虽然内容能被储存在response中,用xpath对我需要的数据进行获取时,返回的都是空值。考虑到数据都在源码中,于是我使用python里的beautifulSoup通过下载源码的方式去获取数据,然后插入到数据库。

需要的python包urllib2​,beautifulSoup,MySQLdb,re

第一,获取整个页面

#coding:utf-8

import urllib2

from BeautifulSoup import BeautifulSoup

​url='http://jianli.58.com/resume/91655325401100'

content = urllib2.urlopen(url).read()

soup=BeautifulSoup(content)

print soup

url为需要下载的网页

通过urllib2.urlopen()方法打开一个网页

read()方法读取url上的数据

第二,筛选你想要的数据

这里需要用到正则表达式,python提供了强大的正则表达式,不清楚的小伙伴可以参考一下资料(http://www.runoob.com/regexp/regexp-syntax.html)

比如,我们需要获取姓名

通过控制台可以看到名字所在的位置

可用正则表达式进行匹配,代码如下:

name = re.findall(r'(?<=class="name">).*?(?=)',str(soup))

运行程序,发现返回结果为空。

检查正则表达式是无误的,我们观察之前返回的soup,发现他返回的源码与网页上的源码是不一样的。所有我们根据观察网页上的源码写的正则表达式不能再返回的源码中匹配到相应的内容。因此我们只能通过观察返回的源码写正则表达式。

在soup返回的源码中,我们很容易地找到这个人的全部基本资料,而且都在标签为< li class=”item”>中,通过下面的fandAll()方法,很容易就获取内容

data = soup.findAll('li',attrs={'class':'item'})

通过上面的代码,可以的到如下的结果,可见返回了一个list

这样,我们就获取了这个人的姓名,性别,年龄,工作经验和学历。

通过上面的方法,我们能够获取整个页面你所需要的数据。

第三,把数据保存到数据库

我使用的是mysql数据库,所以这里以mysql为例

连接数据库

conn = MySQLdb.Connect(

host = '127.0.0.1',

port = 3306,user = 'root',

passwd = 'XXXXX',

db = 'XXXXX',

charset = 'utf8')

cursor = conn.cursor()

因为要存储中文,所以在这里设置编码格式为utf8

创建插入语句

sql_insert = "insert into resume(

ID,name,sex,age,experience,education,pay,ad

,job,job_experience,education_experience)

values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"

插入数据

cursor.execute(sql_insert,(ID,name,sex,age,experience,education

,pay,ad,job,job_experience,education_experience))

conn.commit()

关闭数据库

cursor.close()

conn.close()

执行程序

报错了…

(1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '))' at line 1")

发生这个错误,如果sql语法没错,一般就是编码有问题了。

我们的数据库使用的编码是utf8,应该是插入的数据在编码上出现问题了。

我们对返回的数据进行重新编码用decode()和encode()方法实现

name = data[0].decode('utf-8').encode('utf-8')

用这个简单的方法,我们就解决了数据库编码与数据编码不一致导致出错的问题。

为什么编码会不一样呢?

这是因为,我们用BeautifulSoup包爬取网页的时候,返回的数据是ascii编码的数据。而我们的数据库为utf8编码的,所有插入数据是会发生错误,只要对爬取的数据重新进行编码

结果

这个是我爬取的结果,效果还是挺好的,速度大概是1秒个网页,虽然比起scrapy要慢好多,但是BeautifulSoup和urllib2使用简单,适合新手练手。

附录:代码

#coding:utf-8

import urllib2

from BeautifulSoup import BeautifulSoup

import re

import MySQLdb

url = 'http://jianli.58.com/resume/91655325401100'

content = urllib2.urlopen(url).read()

soup = BeautifulSoup(content)

basedata = str(soup.findAll('li',attrs={'class':'item'}))

basedata = re.findall(r'(?<=class="item">).*?(?=)',basedata)

ID = str(soup.findAll('script',attrs={'type':'text/javascript'}))

ID = re.findall(r'(?<=global.ids = ").*?(?=";)',ID)

ID = ID[0].decode('utf-8').encode('utf-8')

name = basedata[0].decode('utf-8').encode('utf-8')

sex = basedata[1].decode('utf-8').encode('utf-8')

age = basedata[2].decode('utf-8').encode('utf-8')

experience = basedata[3].decode('utf-8').encode('utf-8')

education = basedata[4].decode('utf-8').encode('utf-8')

pay = str(soup.findAll('dd',attrs={None:None}))

pay = re.findall(r'(?<=

)d+.*?(?=)',pay)

pay = pay[0].decode('utf-8').encode('utf-8')

expectdata = str(soup.findAll('dd',attrs={None:None}))

expectdata = re.findall(r'''(?<=["']>)[^)''',expectdata)

ad = expectdata[0].decode('utf-8').encode('utf-8')

job = expectdata[1].decode('utf-8').encode('utf-8')

job_experience = str(soup.findAll('div',attrs={'class':'employed'}))

job_experience = re.findall(r'(?<=>)[^

job_experience = ''.join(job_experience).decode('utf-8').encode('utf-8')

education_experience = str(soup.findAll('dd',attrs={None:None}))

education_experience = re.findall(r'(?<=

).*n.*n?.*',education_experience)

education_experience = ''.join(education_experience).decode('utf-8').encode('utf-8')

conn = MySQLdb.Connect(

host = '127.0.0.1',

port = 3306,user = 'root',

passwd = 'XXXXX',

db = 'XXXX',

charset = 'utf8')

cursor = conn.cursor()

sql_insert = "insert into resume(ID, name,sex,age,experience,education,pay,ad,job,job_experience,education_experience)

values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"

try:

cursor.execute(sql_insert, (ID, name,sex,age,experience,education,pay,ad,job,job_experience,education_experience))

conn.commit()

except Exception as e:

print e

conn.rollback()

finally:

cursor.close()

conn.close()

利用python爬取58同城简历数据_利用python爬取58同城简历数据-Go语言中文社区相关推荐

  1. python 图灵 微信 菜谱_python——wxpy模块实现微信尬聊(基于图灵机器人)-Go语言中文社区...

    wxpy(微信机器人)是在itchat基础上开发的微信个人功能服务API,基本可以实现微信各种拓展功能, 支持pip安装,适用2.7以及3.4-3.6的python版本 通过# 导入模块 from w ...

  2. python调用metasploit自动攻击_Python脚本与Metasploit交互进行自动永恒之蓝攻击-Go语言中文社区...

    我们首先利用 findTarget() 函数找到目标网段或目标主机中开放了445端口的主机,然后利用 confickerExploit() 函数将攻击代码写入 configure.rc 配置文件中,最 ...

  3. 用python画一个简单卡通人物_Python绘制可爱的卡通人物 | 【turtle使用】-Go语言中文社区...

    微信公众号:AI算法与图像处理如果你觉得对你有帮助,欢迎关注.转发以及点赞哦-( ̄▽ ̄-)~ Turtle库 简介 什么是Turtle 首先,turtle库是一个点线面的简单图像库,能够完成一些比较简 ...

  4. java爬取网页数据_利用Python做数据分析—对前程无忧数据类岗位进行分析

    引言 随着时代的发展,我国在各行各业都需要大量的人才引进,处于近几年最热门的行业也称"最火行业":大数据.数据分析.数据挖掘.机器学习.人工智能,这五门行业各有不同又互有穿插.近几 ...

  5. python爬取大众点评数据_利用Node.js制作爬取大众点评的爬虫

    前言 Node.js天生支持并发,但是对于习惯了顺序编程的人,一开始会对Node.js不适应,比如,变量作用域是函数块式的(与C.Java不一样):for循环体({})内引用i的值实际上是循环结束之后 ...

  6. python爬取股票大单历史记录_利用bs4爬取股票的历史交易数据

    听起来,爬取股票的所有历史交易数据跟高大上,有木有? 不过写这个爬虫的时候,发现基于网易财经的股票历史数据的爬取其实挺简单,最后再写到txt文档里(暂时写txt,以后会写csv的.可以在用机器学习干一 ...

  7. python爬取餐饮数据_使用 Python 分析全国所有必胜客餐厅

    本文原创发布于微信公众号「极客猴」,欢迎关注第一时间获取更多原创分享 在之前的一篇文章中,我讲到如何爬取必胜客官网中全国各大城市餐厅的信息.虽然餐厅数据信息被抓取下来,但是数据一直在硬盘中" ...

  8. 如何使用python编程抢京东优惠券 知乎_学好Python爬取京东知乎价值数据

    原标题:学好Python爬取京东知乎价值数据 Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这 ...

  9. python爬取知乎话题广场_学习python爬虫---爬虫实践:爬取B站排行榜2(爬取全部分类排行榜、利用pygal库作图)...

    前面我们爬取了B站上全站的排行榜,详细见:魏勇:学习python爬虫---爬虫实践:爬取B站排行榜​zhuanlan.zhihu.com 一.爬取全部分类排行榜 我们观察一下B站排行榜,那里还有番剧排 ...

  10. python爬知识星球付费数据_用python爬取知识星球

    去年我们做过一个叫「学长问答」的社群活动,里面沉淀了大量有价值的互动信息,后来因为各种原因终止了.今天和涂腾聊起来,觉得这些信息就这么沉寂了太浪费.所以就试着用python爬取了知识星球的内容. 这个 ...

最新文章

  1. BZOJ2535 [Noi2010]Plane 航空管制 【贪心 + 堆】
  2. 二分+最大化最小值 River Hopscotch POJ - 3258
  3. leetcode题解189-旋转数组
  4. php mysql安装配置_转载:PHP,MySQL的安装与配置
  5. charles抓手机app的包的操作步骤
  6. js Math对象属性和方法
  7. java中的堆和栈_实例理解Java中的堆和栈
  8. 拓端tecdat|r语言中对LASSO回归,Ridge岭回归和Elastic Net模型实现
  9. DM8168外挂IC卡读写异常
  10. 银行卡查询银行卡类型查询及归属地查询
  11. Hdu 4093 ( Xavier is Learning to Count ) BZOJ2498 FFT+容斥原理
  12. 看一篇就学会系列,mysql慢日志查看,本地mysql是使用phpstudy安装的
  13. linux查看xlsm文件,XLSM 文件扩展名: 它是什么以及如何打开它?
  14. 如何修复cdn服务器异常,cdn服务器连接异常解决方法
  15. 微信云开发——日记小程序
  16. <STM32学习>--跑马灯实验
  17. php 单词拼写检查,拼写检查 · phpstorm手册 · 看云
  18. 关于executeUpdate方法返回的值问题
  19. 【数学建模】2022数维杯国际赛C题 如何利用脑结构特征和认知行为特征诊断阿尔茨海默病(How to Diagnose Alzheimer‘s Disease)
  20. _stprintf_s和_stscanf_s

热门文章

  1. 计算机科学 核心课程,计算机科学与技术的核心课程是什么?
  2. 机器学习算法(1)—— K-近邻算法
  3. 隐藏6年,恶意软件Slingshot通过路由器侵入PC!
  4. 第9章:群体类和群体数据的组织
  5. 登录linux系统进去的步骤,Linux系统的?登录和退出操作步骤
  6. [转载]Word通配字符
  7. logo设计中的“加减”法
  8. 存储引擎(了解内容)
  9. C++ const 修饰符
  10. linux下完全卸载oracle