本篇介绍使用 python 获取网页数据的方法,要爬取 51job Python 职位的招聘信息。在获取数据上,Python 的灵活度比 Power Query 高出 n 个档次。我们打开 https://www.51job.com/ 网页,在搜索的职位栏中,输入 python,地点选择全国。
url 地址栏的地址很长,一会我们要用到,这个地址我在下面标记的部分是页码:
接下来,我们在页面任意地方右键,点击菜单【查看网页源代码】
第一个关注点是页面的字符编码,可以看到 51job 的字符编码是 gbk:
然后,我们找到页面职位表格的 html 源码。页面内容如下:
对应的 html 源码如下,可以通过查找找到这段代码:
有了这些,就可以编码了。我使用正则表达式来获取页面源码的内容,采用简单的懒惰模式,也就是匹配尽可能少的字符,在能使整个匹配成功的前提下使用最少的重复。.*?
表示任意字符,(.*?)
表示提取符合模式的字符。提取的信息通过 pandas 模块导入到 Excel。本示例用到的 pandas 为第三方模块,其他为 Python标准模块。pandas 用 pip 的方式安装。
import urllib.request # python标准模块
import re # python标准库正则表达式模块
import pandas as pd # pandas库,第三方模块,用pip方式安装
jobs = []
def get_data(page):
# url 来自页面URL拷贝
url = "https://search.51job.com/list/000000,000000,0000,00,9,99," \
"python,2,{}.html?lang=c&stype=&postchannel=0000" \
"&workyear=99&cotype=99°reefrom=99&jobterm=99" \
"&companysize=99&providesalary=99&lonlat=0%2C0" \
"&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0" \
"&address=&line=&specialarea=00&from=&welfare="\
.format(page)
html = urllib.request.urlopen(url).read().decode('gbk')
return html
def parse_job_info(html):
pattern = r'<p class="t1 ">.*?<a target="_blank" title="(.*?)"' + \
'.*?<span class="t2"><a target="_blank" title="(.*?)"' + \
'.*?<span class="t3">(.*?)</span>' + \
'.*?<span class="t4">(.*?)</span>' + \
'.*?<span class="t5">(.*?)</span>'
content = re.findall(pattern, html, re.S)
return content
if __name__ == "__main__":
for i in range(1, 21): # 获取前20页的数据
html = get_data(page=i)
found = parse_job_info(html)
jobs = jobs + found
df = pd.DataFrame(jobs, columns=['职位','公司','工作地点', '薪资','发布日期'])
df.to_excel('python-jobs.xlsx')
网友评论