爬虫爬取智联招聘
import urllib.parse
import time
import datetime
import re
import urllib.request
import urllib.robotparser
import pymysql
from selenium import webdriver #webdriver网页内驱动软件
# 根据域名计算并延迟一定的时间
class Throttle:
def __init__(self, delay):
# 访问同域名时需要的间隔时间 delay延期
self.delay = delay
# key:netloc,value:lastTime.记录每个域名的上一次访问的时间戳 domains域名
self.domains = {}
# 计算需要的等待时间,并执行等待
def wait(self, url):
if self.delay <= 0:
return
domain = urllib.parse.urlparse(url).netloc #urllib数据 parse解析 urlparse的差别
lastTime = self.domains.get(domain) #lastTime上次登陆
if lastTime is not None:
# 计算等待时间 wait等待 sec秒 now现在 seconds秒
wait_sec = self.delay - (datetime.datetime.now() - lastTime).seconds
if wait_sec > 0 :
time.sleep(wait_sec)
self.domains[domain] = datetime.datetime.now()
# 下载网页
def download(url, headers={}, proxy=None, retry_count=5):
print('downloading:' + url)
request = urllib.request.Request(url, headers=headers)
# 支持代理 proxy代理
if proxy:
proxy_handler = urllib.request.ProxyHandler({"http": "http://%(host)s:%(port)d" % proxy})
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)
try:
response = urllib.request.urlopen(request)
html = response.read()
except urllib.error.URLError as e:
print(e)
if hasattr(e, 'code') and 500 <= e.code < 600:
return download(url, headers, retry_count - 1)
return None
return html
#webdriver网页内驱动软件
driver = webdriver.Chrome(r"D:\chromedriver.exe")
urlFormat = 'https://sou.zhaopin.com/?p={0}&jl=489' #format格式
num = 1
while 1:
driver.get(urlFormat.format(num))
t = Throttle(5)
t.wait(urlFormat)
num +=1
print("我是下一个需要爬取的页数:",num)
# 可以通过implicitlywait()方法设置超时时间。
driver.implicitly_wait(30)
# 我们设置了30秒的延时。如果我们要查找的元素没有出现,Selenium
# 至多等待30秒,然后就会抛出异常。要想选取国家链接,我们依然可以使用
# WebKit示例中用过的那个 css 选择器 。
link1 = driver.find_elements_by_xpath("//div[@class='contentpile__content__wrapper__item clearfix']")
list_gs =[link.text for link in link1]
#数据保存到文件
f = open('1.txt','wb')
print(list_gs)
for i in list_gs:
print(i)
f.write((i + '\n\n\n').encode('utf8')) #write写
f.flush()#保证数据及时从缓存写入本地
#数据保存到数据库
# print(list_gs)
# for i in list_gs:
# print(i.split()[0])
# # 连接数据库,获取连接对象
# conn = pymysql.connect(
# host="localhost",
# port=3306,
# user='root',
# password='152176',
# database='zhilianzhaopin',
# charset='utf8'
# )
#
# # 获取游标
# my_cursor = conn.cursor()
#
# # 添加执行sql语句
#
# sql = "insert into sj(job,username,salary,xueli) values(%s,%s,%s,%s)"
# my_cursor.execute(sql, (i.split()[0], i.split()[1], i.split()[2], i.split()[5]))
#
# # 提交事务,关闭连接
# conn.commit()
# conn.close()
网友评论