需要准備的環境:
(1)python3.8
(2)pycharm
(3)截取網絡請求信息的工具,有很多,百度一種隨便用即可。
第一:首先通過python的sqlalchemy模塊,來新建一個表。

第二:通過python中的request模塊接口的形式調取數據。
思路:(1)先獲取所有城市信息:需要用request模塊中的【requests.session()】session對象保存訪問接口需要用到的信息:例如cookies等信息。
(2)通過城市分組,再用正則表達式篩選來獲取python的崗位信息。
其中多次用到列表生成器,以后要多注意這方面的冷知識;不然會有莫名的錯誤。、
代碼思路:只要保證可復用即可,其實很簡單,畢竟Python是一門”干凈“的語言。
(1)先把請求方法抽集到一個方法中:
session.get(url(地址),headers(頭信息),,timeout(時間),proxies(代理信息))
(2)先獲取所有城市,利用列表生成器生成一個list把數據裝進去。
(3)利用循環以城市分組拉去Python崗位信息。
for city in lagou.city_list:
調用拉取崗位信息的方法。
(4)導入multiprocessing模塊,設置多線程加速抓取:multiprocessing.Pool(自定 int or long)
需要注意的是:必須利用代理,以及多線程拉取。否則效率低下,可能導致信息不全,時間太慢。

第三:將拉取的數據存入表中
思路:(1)由於拉取的是JSON格式,所以解讀JSON格式,也是很繁瑣的,需要把要的數據一條一條對應到固定的Key里,如圖:

(2)利用session對象的query方法,可以過濾查詢想要的數據。 session.query(Lagoutables.workYear).filter(Lagoutables.crawl_date==self.date).all()
第四:利用前台模板,將數據可視化。
(1)首先需要通過編寫JS文件,將幾個圖的數據放在一個方法里提高聚合,抽取出來提高可復用性。 (2)然后通過拼接把獲取到的JSON格式的數據,按key:balue格式分配出來。 代碼如下: 利用Ajax通信

結果展示:

主要代碼展示:
第一部分:拉取數據。
(1)使用session保存cokkies信息。
self.lagou_session = requests.session()
(2)寫一個request方法;用於請求數據。使用多線程,以及代理的方式來;否則會記錄惡意IP,不能爬蟲。
def handle_request(self,method,url,data=None,info=None):
while True:
#加入阿布雲的動態代理
proxyinfo = "http://%s:%s@%s:%s" % ('H1V32R6470A7G90D', 'CD217C660A9143C3', 'http-dyn.abuyun.com', '9020')
proxy = {
"http":proxyinfo,
"https":proxyinfo
}
try:
if method == "GET":
# response = self.lagou_session.get(url=url,headers=self.header,proxies=proxy,timeout=6)
response = self.lagou_session.get(url=url,headers=self.header,timeout=6)
elif method == "POST":
# response = self.lagou_session.post(url=url,headers=self.header,data=data,proxies=proxy,timeout=6)
response = self.lagou_session.post(url=url,headers=self.header,data=data,timeout=6)
except:
# 需要先清除cookies信息
self.lagou_session.cookies.clear()
# 重新獲取cookies信息
first_request_url = "https://www.lagou.com/jobs/list_python?city=%s&cl=false&fromSearch=true&labelWords=&suginput=" % info
self.handle_request(method="GET", url=first_request_url)
time.sleep(10)
continue
response.encoding = 'utf-8'
if '頻繁' in response.text:
print(response.text)
#需要先清除cookies信息
self.lagou_session.cookies.clear()
# 重新獲取cookies信息
first_request_url = "https://www.lagou.com/jobs/list_python?city=%s&cl=false&fromSearch=true&labelWords=&suginput="%info
self.handle_request(method="GET",url=first_request_url)
time.sleep(10)
continue
return response.text
(3)寫一個具體的URL來拉取網頁信息。比如:
#獲取全國所有城市列表的方法
def handle_city(self):
city_search = re.compile(r'www\.lagou\.com\/.*\/">(.*?)</a>')
city_url = "https://www.lagou.com/jobs/allCity.html"
city_result = self.handle_request(method="GET",url=city_url)
#使用正則表達式獲取城市列表
self.city_list = set(city_search.findall(city_result))
self.lagou_session.cookies.clear()
第二部分:將拉取的數據存入數據庫。
將數據庫字段與獲取到的JSON數據對應,代碼簡單就不舉例了。
主要是用到數據庫的session信息;通過導包,獲得該數據庫連接的Session對象,然后操作數據庫。
#插入數據 self.mysql_session.add(data) #提交數據到數據庫 self.mysql_session.commit()
第三部分:將數據庫數據以Echarts工具展示出來。
可以查看官網有教學: https://www.echartsjs.com/zh/index.html
主要也是去修改js文件,比較簡單;這里就不做示范了。
全部代碼,可以去本人的Githup上下載。
注意:本次爬蟲教學並不是本人所原創,只是分享一下學習結果。
