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爬虫实战入门六:提高爬虫效率—并发爬取智联招聘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cobaltstrike安装_Cobal
- 下一篇: python数据源_python数据源