智联招聘 爬虫职位信息的爬取
生活随笔
收集整理的這篇文章主要介紹了
智联招聘 爬虫职位信息的爬取
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、電腦系統:ubuntu 18.04.5 LTS ;開發工具:pycharm;編譯環境:anaconda3,python_vesion:Python 3.8;第三方庫文件:Scrapy,selenium
2、下面就是代碼了,想說的話都在注釋里了
第一步:編寫middlewares.py文件: from ScrapySpider.setting import USER_AGENT_LIST,PROXIY_LIST import base64 import random from selenium import webdriver from time from scrapy.http import HtmlResponse#開啟Headers頭文件,User-Agent代理池,隨機選取User-Agent class Random_UserAgent :def process_request(self,request,spider):User_Agent = random.choice(USER_AGENT_LIST)request.headers['User_Agent'] = User_Agent#開啟ip代理,從ip代理池中隨機選取代理IP class Random_Proxies() :def process_request(self,request,spider):proxy = random.choice(PROXIY_LIST)if 'user_password' in proxy :bs64 = base64.b16decode(proxy['user_password'])#因為代理IP有賬號密碼,所以要進行編碼處理 request.headers['Proxy_Authorization'] ='Basic ' +b64_up.decode('utf-8') request.meta['Proxy'] = proxy['ip_port']else:request.meat['Proxy'] = proxy['ip_port']#這里Proxy不能寫成小寫p,會報錯#根據爬取的網頁不同,選用selenium,做模擬登錄或模擬點擊JS #這里只為驅動url中的js,以獲取JS生成的數據 class SeleniumMiddleware():def process_request(self,request,spider):url = request.urlif 'scode' in url :#這里是判斷想要獲取的url中的數據,是否需要用到seleniumwebdriver.PhantomJS()#加載無圖瀏覽器driver = webdriver.Chrome()#加載谷歌瀏覽器---谷歌瀏覽器需要下載驅動,放入usr/bin文件中deiver.get(url)time.sleep(3) data = driver.page_sourcedriver.close()res = HtmlResponse(url =url,body=data,encoding='utf-8',request =request)return res第二步:編寫setting.py 文件#將上面寫的三個類開啟 DOWNLOADER_MIDDLEWARES = {'ScrapySpider.middlewares.SeleniumMiddleware': 544,'ScrapySpider.middlewares.Random_Agent': 543,'ScrapySpider.middlewares.Random_Proxy': 542 }# Obey robots.txt rules 服從roobt.txt(遵守Robot協議的一個文件),保存在網站的服務器里,他告訴搜索爬蟲引擎,網站上哪些目錄下不希望被爬取收錄。Ture表示遵守。 ROBOTSTXT_OBEY = False#USER_ANGET和PROXY_LIST USER_AGNET_LIST = [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1', 'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1', 'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11', 'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11', ]#User-Agent 網上很多#代理池的建立可以建立在數據庫中 PROXY_LIST =[{"ip_port" : "47.104.132.34:16818"} ] #網上的一些免費ip大都不可行,這上面的ip和我電腦ip綁定了,其他電腦用不了3、爬蟲文件
class ZhaopinspiderSpider(scrapy.Spider):name = 'zhaopinSpider'allowed_domains = ['zhaopin.com']start_urls = ['http://sou.zhaopin.com/?jl=749&kw=%E7%88%AC%E8%99%AB&p=1']def start_requests(self):url = self.start_urls[0]# cookie 分割,變為字典形式temp = '個人登錄智聯招聘的cookie,智聯的cookie還是能用很長時間'cookies = {}for cookie in cookie_list:list = cookie.split('=')cookies[list[0].strip()] = list[1]yield scrapy.Request(url=url,callback=self.parse,cookies=cookies,dont_filter=True)def parse(self,response):print(response.request.headers['headers'])#打印每次請求的User-Agentdiv_list = response.xpath('//*[@id="positionList-hook"]/div/div')#職位展示頁面中,想要爬取的數據部位,它的結構是一樣的,可以通用for div in div_list :href = div.xpath('./a/@href').extract_first()zhiwei = div.xpath('./a/div[1]/div[1]/span/@title').extract_first()gongzi = div.xpath('./a/div[2]/div[1]/p/text()').extract_first().strip()company = div.xpath('./a/div[1]/div[2]/span/@title').extract_first()print('**************')print(href,zhiwei,gongzi,company)print(' ')yield scrapy.Request(url=href ,callback=self.parse_datil, dont_filter=True)def parse_datil(self,response):#每條招聘的詳細信息介紹頁面,想要爬取的數據部位,結構都不一樣#下面這一堆都是為了一次性拿到數據,中間試很多錯,最后只弄出來了這#樣差勁的數據出來,還要繼續做數據清洗#ps:這部分數據的提取,用xpath感覺不太好。可以試試正則,可能幾條正則#解決了,之后可以試試print('**********')print(response.url)node_list = response.xpath('//*[@id="root"]/div[4]/div[1]/div[1]/div[1]')#這上下兩行不同,是因為有一個頁面的數據部分,節點定位和其他不一樣,開始#我只用上面一行,會有一條連接,獲取不到數據node_list1 = response.xpath('//*[@id="root"]/div[4]/div[1]/div[1]/div[2]')#獲取節點1,div[2]標簽中所有的P標簽數據pTag_list = node_list.xpath('./div[2]/p').extract()#獲取節點1,div[2]標簽中所有的div標簽數據divTag_list = node_list.xpath('./div[2]/div').extract()#獲取節點2,div[2]標簽中所有的div標簽數據divTag_list1 = node_list1.xpath('./div[2]/div').extract()#獲取節點1,div[2]標簽的文本數據text_list = node_list.xpath('./div[2]/text()').extract()#上面這4種,就是我在這個頁面發現出現的結構,我是問過前端開發的朋友#為什么會出現這樣非結構性的,他說是根據情況而寫的,很正常,我在想,#現在寫前端也用框架了,吶,用框架寫出的東西應該都是一樣的吧。if pTag_list :#判斷獲取的P標簽是否為空for info in pTag_list:print(info.strip())if divTag_list :#判斷獲取的div標簽是否為空for info in divTag_list:print(info.strip())elif text_list:#如果上面為空,則判斷div[2]標簽中文本為空print(text_list)else:for info in divTag_list1:#如果文本都是空,那說明div[2]沒有數據,應該去找另一節點print(info) #上面的這個解析規則,是我個人查看單個頁面,寫出來的。輸出結果,倒是對的起寫了這些東西 #個人感覺就是很不友好,不知道哪位大神,有更好的解析方式。 #后面管道和item我沒有寫,畢竟我只想看看結果 ,?
總結
以上是生活随笔為你收集整理的智联招聘 爬虫职位信息的爬取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 艺赛旗(RPA)新手课堂 - 原始字符串
- 下一篇: 抓取起点中文网小说