日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python爬虫多url_Python爬虫实战入门六:提高爬虫效率—并发爬取智联招聘

發布時間:2025/3/19 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python爬虫多url_Python爬虫实战入门六:提高爬虫效率—并发爬取智联招聘 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前文章中所介紹的爬蟲都是對單個URL進行解析和爬取,url數量少不費時,但是如果我們需要爬取的網頁url有成千上萬或者更多,那怎么辦?

使用for循環對所有的url進行遍歷訪問?

嗯,想法很好,但是如果url過多,爬取完所有的數據會不會太過于耗時了?

對此我們可以使用并發來對URL進行訪問以爬取數據。

一般而言,在單機上我們使用三種并發方式:多線程(threading)

多進程(multiprocessing)

協程(gevent)

對于以上三種方法的具體概念解釋和說明,各位可以自行網上搜索了解,相信會比我解釋得清楚,所以在此就不對它們進行解釋說明了。

本系列文章有兩個重點,一個是實戰,一個是入門,既為實戰,理論性的東西就描述得比較少;既為入門,所講述的都是簡單易懂易操作的東西,高深的技術還請入門之后自行探索,那樣也會成長得更快。

那么下面,開始并發爬取的實戰入門,以多進程為例,并發爬取智聯招聘的招聘信息。

一、分析URL和頁面結構

1、搜索全國范圍內職位名包含“Python”的職位招聘

我們不分職業類別、不分行業類別,工作地點選為全國,職位名為“Python”,對招聘信息進行搜索,結果如下圖:

我們注意圖中三個紅框的信息:搜索結果的url結構;(構造url地址進行for循環遍歷)

搜索結果的條數;(判斷url的數量)

采集的信息的主體;(解析數據)

通過篩選url參數,我們確定了需要爬取的基本URL為:

http://sou.zhaopin.com/jobs/searchresult.ashx?jl=全國&kw=python&kt=3&p=2

其中

http://sou.zhaopin.com/jobs/searchresult.ashx

為請求地址和目錄

jl:工作地點參數

kw:搜索的關鍵字

kt:以職位名搜索

p:頁數

我們可以發現,除了頁數會變化之外,其余的參數值都是固定的值。我們來確定一下搜索結果的總頁數。

因為網頁上有提示一共有多少個職位滿足條件,我們拿總職位數除以單頁顯示的職位數量即可知道搜索結果的頁數。

# coding:utf-8

import requests

from bs4 import BeautifulSoup

import re

url = 'http://sou.zhaopin.com/jobs/searchresult.ashx?jl=全國&kw=python&p=1&kt=3'

wbdata = requests.get(url).content

soup = BeautifulSoup(wbdata, 'lxml')

items = soup.select("div#newlist_list_content_table > table")

count = len(items) - 1

# 每頁職位信息數量

print(count)

job_count = re.findall(r"共(.*?)個職位滿足條件", str(soup))[0]

# 搜索結果頁數

pages = (int(job_count) // count) + 1

print(pages)

結果返回每頁60條職位信息,一共有14頁。

那么我們的待爬取的url地址就有14個,url地址中參數p的值分別從1到14,這么少的url,使用for循環也可以很快完成,但在此我們使用多進程進行演示。

二、在爬蟲中使用多進程

先上代碼:

# coding:utf-8

import requests

from bs4 import BeautifulSoup

from multiprocessing import Pool

def get_zhaopin(page):

url = 'http://sou.zhaopin.com/jobs/searchresult.ashx?jl=全國&kw=python&p={0}&kt=3'.format(page)

print("第{0}頁".format(page))

wbdata = requests.get(url).content

soup = BeautifulSoup(wbdata,'lxml')

job_name = soup.select("table.newlist > tr > td.zwmc > div > a")

salarys = soup.select("table.newlist > tr > td.zwyx")

locations = soup.select("table.newlist > tr > td.gzdd")

times = soup.select("table.newlist > tr > td.gxsj > span")

for name, salary, location, time in zip(job_name, salarys, locations, times):

data = {

'name': name.get_text(),

'salary': salary.get_text(),

'location': location.get_text(),

'time': time.get_text(),

}

print(data)

if __name__ == '__main__':

pool = Pool(processes=2)

pool.map_async(get_zhaopin,range(1,pages+1))

pool.close()

pool.join()

結果如下:

因為除了使用了多進程之外,其他的代碼與之前文章介紹的方法大同小異,所以在此只介紹一下多進程的核心代碼:

from multiprocessing import Pool

multiprocessing是Python自帶的一個多進程模塊,在此我們使用其Pool方法。

if __name__ == '__main__':

pool = Pool(processes=2)

pool.map_async(get_zhaopin,range(1,pages+1))

pool.close()

pool.join()實例化一個進程池,設置進程為2;

調用進程池的map_async()方法,接收一個函數(爬蟲函數)和一個列表(url列表)

如此,在爬蟲中使用多進程進行并發爬取就搞定了,更多高級、復雜強大的方法,還請各位參考其他文檔資料。

=======================================================================

文章首發微信公眾號:州的先生

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的python爬虫多url_Python爬虫实战入门六:提高爬虫效率—并发爬取智联招聘的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。