需要準備的環境: (1)python3.8 (2)pycharm (3)截取網路請求信息的工具,有很多,百度一種隨便用即可。 第一:首先通過python的sqlalchemy模塊,來新建一個表。 第二:通過python中的request模塊介面的形式調取數據。 思路:(1)先獲取所有城市信息:需要用 ...
需要準備的環境:
(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上下載。
註意:本次爬蟲教學並不是本人所原創,只是分享一下學習結果。