久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

適合新手入門的Python小爬蟲

 老碼識(shí)途 2023-10-10 發(fā)布于廣東

概述

不知從何時(shí)起,Python和爬蟲就如初戀一般,,情不知所起,,一往而深,相信很多朋友學(xué)習(xí)Python,,都是從爬蟲開始,,其實(shí)究其原因,,不外兩方面:其一Python對(duì)爬蟲的支持度比較好,類庫眾多,。其二Pyhton的語法簡(jiǎn)單,,入門容易。所以兩者形影相隨,,不離不棄,,本文主要以一個(gè)簡(jiǎn)單的小例子,簡(jiǎn)述Python在爬蟲方面的簡(jiǎn)單應(yīng)用,,僅供學(xué)習(xí)分享使用,,如有不足之處,還請(qǐng)指正,。

涉及知識(shí)點(diǎn)

本例主要爬取某job發(fā)布的工作職位,,用到的知識(shí)點(diǎn)如下:

  • 開發(fā)環(huán)境及工具:主要用到Python3.7 ,IDE為PyCharm

  • requests類庫:本類庫封裝了python的內(nèi)置模塊,,主要用于網(wǎng)絡(luò)的請(qǐng)求和獲取數(shù)據(jù),,可以支持不同形式的請(qǐng)求。

  • BeautifulSoup庫:主要用于解析獲取的數(shù)據(jù),,包括Html,,Xml,Json等不同的格式,。

  • 數(shù)據(jù)持久化:主要是將內(nèi)存中的數(shù)據(jù),,保存到數(shù)據(jù)庫或者文件中。

爬蟲的基本步驟

爬蟲的基本步驟,,如下圖所示:

爬取目標(biāo)

如有要爬取相關(guān)內(nèi)容,首先要對(duì)爬取的目標(biāo)進(jìn)行分析,,了解其目錄結(jié)構(gòu),,才能進(jìn)行解析。本例主要爬取某job中的工作列表,,如下所示:

核心源碼

1.獲取數(shù)據(jù)

定義一個(gè)函數(shù)get_data,,用于發(fā)起請(qǐng)求并獲取數(shù)據(jù),如下所示:

headers中的User-Agent主要用于模擬瀏覽器,,不然會(huì)被反爬蟲程序屏蔽,,http狀態(tài)碼為418,意思是被網(wǎng)站的反爬程序返回的。

encoding是要爬取的網(wǎng)站的編碼為gbk,,如果不加,,會(huì)產(chǎn)生亂碼,默認(rèn)為utf-8

def get_data(req_url):    """獲取數(shù)據(jù)"""    headers = {        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko',        'Accept-Language': 'zh-Hans-CN, zh-Hans;q=0.5'    }    resp = requests.get(req_url, headers=headers)    resp.encoding = 'gbk'  # 不加會(huì)產(chǎn)生中文亂碼    if resp.status_code == 200:        return resp.text    else:        return None

2.解析數(shù)據(jù)

定義一個(gè)函數(shù)parse_data,,用于解析獲取到的內(nèi)容,,如下所示:

采用BeautifulSoup,,將返回的文本,解析成html對(duì)象,,并獲取對(duì)應(yīng)的內(nèi)容,。本例主要獲取工作的列表

def parse_data(resp_html):    """解析數(shù)據(jù),并返回列表"""    soup = BeautifulSoup(resp_html, features='html.parser')    job_table = soup.find('div', attrs={'class': 'dw_table'})    # print(job_table)    job_list = job_table.find_all('div', attrs={'class': 'el'})    # print(job_list)    # 循環(huán)列表,去掉第一個(gè)title和最后一個(gè)    res_list = []    for job in job_list[1: -1]:        job_name = job.find('p', attrs={'class': "t1"}).find('span').find('a').get_text()        job_name = job_name.replace('\r\n', '').strip()        job_company = job.find('span', attrs={'class': "t2"}).find('a').get_text()        job_addr = job.find('span', attrs={'class': "t3"}).get_text()        job_salary = job.find('span', attrs={'class': "t4"}).get_text()        job_time = job.find('span', attrs={'class': "t5"}).get_text()        # print('工作信息:', job_name, '---', job_company, '---', job_addr, '---', job_salary, '---', job_time)        res_item = {            '工作名稱': job_name,            '公司': job_company,            '工作地址': job_addr,            '薪資水平': job_salary,            '發(fā)布時(shí)間': job_time        }        res_list.append(res_item)    return res_list

3.保存數(shù)據(jù)

定義一個(gè)函數(shù)save_data,,用于將獲取到的內(nèi)容保存到j(luò)son文件中,,如下所示:

with函數(shù) 可以自動(dòng)進(jìn)行釋放。因包含中文,,所以json文件的編碼為utf-8,,否則會(huì)出現(xiàn)亂碼

def save_data(res_list):    """保存數(shù)據(jù)"""    with open('jobs.json', 'w', encoding='utf-8') as f:        res_list_json = json.dumps(res_list, ensure_ascii=False)        f.write(res_list_json)

4.整體調(diào)用步驟

依次調(diào)用定義的三個(gè)函數(shù),如下所示:

if __name__ == '__main__':    """如果是主程序自己調(diào)用"""    req_url = 'https://search.**job.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='    # 獲取數(shù)據(jù)    resp_html = get_data(req_url)    # print(html)    # 解析數(shù)據(jù)    res_list = parse_data(resp_html)    # 保存數(shù)據(jù)    save_data(res_list)

爬取結(jié)果展示

爬取的結(jié)果保存在jobs.json文件中,,示例如下所示:

[  {    "工作名稱": "Java架構(gòu)師",    "公司": "深圳市鉆木信息技術(shù)有限公司",    "工作地址": "深圳-福田區(qū)",    "薪資水平": "1.8-3萬/月",    "發(fā)布時(shí)間": "06-13"  },  {    "工作名稱": "JAVA開發(fā)工程師",    "公司": "江蘇康尚生物醫(yī)療科技有限公司",    "工作地址": "深圳-寶安區(qū)",    "薪資水平": "1-1.5萬/月",    "發(fā)布時(shí)間": "06-13"  },  {    "工作名稱": "Java開發(fā)工程師",    "公司": "上海舟恩信息技術(shù)有限公司",    "工作地址": "深圳-南山區(qū)",    "薪資水平": "1.4-1.9萬/月",    "發(fā)布時(shí)間": "06-13"  }]

進(jìn)一步思考

本例可以進(jìn)一步優(yōu)化的空間,,如下所示:

  • 本次爬蟲只是單次爬取,數(shù)據(jù)量相對(duì)小,,如果要爬取大量數(shù)據(jù)的時(shí)候,,則需要使用多線程相關(guān)的知識(shí)。

  • 基礎(chǔ)的爬蟲,,只能爬取靜態(tài)渲染的內(nèi)容,,如果是異步動(dòng)態(tài)渲染的數(shù)據(jù),如何爬取呢,?

  • 將爬取的結(jié)果保存到數(shù)據(jù)庫如何操作呢,?

備注

芙蓉樓送辛漸
[唐]王昌齡
寒雨連江夜入?yún)牵矫魉涂统焦隆?br>洛陽親友如相問,,一片冰心在玉壺,。

學(xué)習(xí)爬蟲,從關(guān)注“老碼識(shí)途”開始?。,。?/span>

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多