from queue import Queue
import requests
from selenium import webdriver
import time
import lxml.html
import re
class ZhiLianSpider(object):
‘’’
下载贴吧某页的内容,把下载的内容保存
‘’’
def __init__(self,name,pages):
'''
初始化所要调用的内容
:param name:
:param pages:
'''
self.tieba_name = name
self.tieba_pages = pages
self.base_url = "https://www.zhaopin.com/"
self.header = {"User-Agent":"Python"}
#self.crawl_queque是实例化Queue()类的一个对象
self.crawl_queque = Queue()
#UrlType后面是类/实例的两个属性,因为UrlType初始化的时候给了两个属性,所以在队列当中put(添加UrlType对象的实例)
#初始化中加载一下我们的浏览器,说明可以用selenium模拟了,用来进行翻页及获取工作条目
self.browser = webdriver.Chrome(executable_path="/cdrom/chromedriver")
#get一下智联的网址,
self.browser.get("https://sou.zhaopin.com/?jl=765&kw=python&kt=3")
#构建一个假地址,因为队列不能为空,fakeplace这个名字是随便起的,按照网址结构写可以用到系统库,便于后序扩展
self.crawl_queque.put("fakeplace://next")
def run(self):
'''
主业务逻辑,使用run后期可以改造成多线程爬虫
:return:
'''
while not self.crawl_queque.empty():
url_str = self.crawl_queque.get()
time.sleep(7)#保证初始化加载及翻页能够正常的完成
#获取智联招聘python职位一页上的所有职位条目(Item及一行数据)
result_elements = self.browser.find_elements_by_css_selector("div.contentpile__content__wrapper > div.contentpile__content__wrapper__item")
#循环遍历所有Item数据,获取每条Item中的地址信息
for element in result_elements:
#获取a标签中的href属性,注意:必须使用get_attribute,selenium不支持@href这种操作
detail_url = element.find_element_by_xpath(".//a").get_attribute("href")
# 使用requests下载
#requests必须下载完当前链接才能下载下一个,不是异步的,这里不用休眠
response = requests.get(detail_url,{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"})
#解析职位详情
parse_result = lxml.html.fromstring(response.text)
#获取详情页中的职位描述
job_detail = parse_result.xpath("//div[@class='pos-ul']//text()") #岗位要求详情
address = parse_result.xpath("//p[@class='add-txt']/text()")[0] #工作地址
education = parse_result.xpath("//div[@class='info-three l']/span[3]/text()")[0] #学历要求
work_years = parse_result.xpath("//div[@class='info-three l']/span[2]/text()")[0] #工作经验
company_name = parse_result.xpath("//div[@class='company l']/a[@target='_blank']/text()")[0] #公司的名字
city = parse_result.xpath("//div[@class='info-three l']/span/a/text()")[0] #工作的城市
min_salary = parse_result.xpath("//div[@class='l info-money']/strong/text()")[0].split("-")[0] #最低薪资
max_salary = parse_result.xpath("//div[@class='l info-money']/strong/text()")[0].split("-")[-1] #最高薪资
text = response.text
welfare = re.findall(r"var JobWelfareTab = .+",text)[0].split("'")[1] #福利待遇
print(welfare)
#使用双浏览器一个显示详情页另一个显示翻页
# self.browser_detail.get(detail_url)
#翻页之前将浏览器滚动到翻页标签处,如果不使翻页标签(下一页)出现,有可能无法被选中
self.browser.execute_script("window.scrollTo(0,document.body.scrollHeight - 100)")
time.sleep(1)#等待滚动完成
#获取上一页和下一页两个按钮
next_elements = self.browser.find_elements_by_css_selector("div.soupager > button.soupager__btn")
#点击下一页
next_elements[1].click()
#放入翻页伪地址,使crawl_queque。empty不为空,翻页能够继续进行
self.crawl_queque.put("fakeplaceone://next")
if True:
pass
else:
pass
tieba_spider = ZhiLianSpider(“python”,1)
tieba_spider.run()