• 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-Language': 'zh-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     else:
    12         return None

    2.解析数据

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

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

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

    3.保存数据

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

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

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

    4.整体调用步骤

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

     1 if __name__ == '__main__':
     2     """如果是主程序自己调用"""
     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)
     7     # 解析数据
     8     res_list = parse_data(resp_html)
     9     # 保存数据
    10     save_data(res_list)

    爬取结果展示

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

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

    进一步思考

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

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

    备注

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

  • 相关阅读:
    placeholder这个属性 input
    使用jqprint插件实现打印页面内容
    HTML用JS导出Excel的五种方法
    项目兼容ie8技术要点
    JS设置cookie、读取cookie、删除cookie
    实战WCF中net.tcp和net.msmq绑定协议
    KO工作原理及带来的好处
    jQuery验证控件jquery.validate.js使用说明+中文API(转)
    将datatable导出为excel的三种方式(转)
    javascript面试题(一)(转载)
  • 原文地址:https://www.cnblogs.com/hsiang/p/13121404.html
Copyright © 2020-2023  润新知