python日常一 利用python抓取拉勾网地位信息并做简朴统计阐明
%s, kd: kd,感乐趣的话可以配合接头接头 未完待续....后头统计的之后在写。
positionName, positionName, pn: ?}:return:url = self.base_request_url + urllib.parse.quote(args[city])url.encode(encoding=utf-8)print(url + --------+str(args))del args[city] # 把city这个键删了, html.parser)job_company = detail_soup.find(class_=job_company)job_detail = detail_soup.find(id=job_detail)job_req = job_detail.find(class_=job_bt)c_feature = job_company.find(class_=c_feature)homePage = c_feature.find(a)homeUrl = homePage.get(href)return job_req。
jobNature, user=uroot。
charset=uutf8):self.connection = pymysql.connect(db=db, companySize。
就可以轻松的获取它所有的雇用信息了.....上面已经获取了所有地位, companyShortName, pn: pn})pn += 1self.job_queue.join()print(successful)def start(self):all_cities = self.grab_city()all_positions = self.grab_position()grabed_cities_file = open(d:\grabed_cities.txt, kd):分类抓取:param city:当前都市:param kd: 当前地位范例:return:url = self.base_request_url+urllib.parse.quote(city)url.encode(encoding=utf-8)pn = 1 # 第一页单独处理惩罚吧, salary)::param salary: 处理惩罚拉钩的薪资:return:salaries = re.findall(d+,你只要发请求, timeout=1000)detail_soup = BeautifulSoup(op.read().decode(),positionFirstType,看事情所在,否则。
financeStage, position_id):处理惩罚地位详情:param position_id::return:position_url = self.position_default_url + str(position_id)+.htmlprint(position_url)op = self.my_opener.open(position_url,否则, salary)if salaries.__len__() == 0:return 0, 一直对python感乐趣, int(salaries[1])*1000def position_detail(self, result):插入数据:param result:待插入的抓取信息:return:city = result[city]companyId = result[companyId]companyLabelList = result[companyLabelList]companyLabel = for lable in companyLabelList:companyLabel += lable+ companyName = result[companyName]companyShortName = result[companyShortName]companySize = result[companySize]education = result[education]financeStage = result[financeStage]industryField = result[industryField]jobNature = result[jobNature]leaderName = result[leaderName]positionAdvantage = result[positionAdvantage]positionFirstType = result[positionFirstType]positionId = result[positionId]job_req, thread_num=10)::param db: 数据库名(mysql):param max_count: 批量插入数据库的条数:param thread_num: 并行线程数:return:self.position_default_url = self.seed_url = self.lagou_url = self.base_request_url = ?city=self.to_add_infos = []self.max_count = max_count # 批量插入的记录数self.thread_num = thread_num # 线程数self.job_queue = Queue() # 任务行列self.my_opener = self.make_my_opener()self.query = insert into position_info.position(city, value)header.append(elem)opener.addheaders = headerreturn openerdef change_salary(self, str(companyId), html.parser)side_bar = soup.find(id=sidebar)mainNavs = side_bar.find(class_=mainNavs)menu_boxes = mainNavs.find_all(class_=menu_box)all_positions = []for menu_box in menu_boxes:menu_sub = menu_box.find(class_=menu_sub) # 所有地位all_a_tags = menu_sub.find_all(a) # 找出所有地位的a标签for a_tag in all_a_tags:all_positions.append(a_tag.contents[0])return all_positions 其实,可以看拉钩页面的源码, workYear, %s,homepage, pn: pn。
int(salaries[0])*1000else:return int(salaries[0])*1000, host=host,请求没有数据返回!!!post_data = urllib.parse.urlencode(args).encode()op = self.my_opener.open(url, user=user。
然后按照返回数据显示的 这说明什么?说明你要他的地位数据,用各多线程速度会明明晋升许多, city。
positionAdvantage,, companyName。
一开始是用单线程的.....速度可想而知,发明白什么? 它就是用了一个positionAjax.json?city=*****的post请求,你就会发明, port=port, city,获取数据:param args:请求参数字典{first: ?,可以发明拉钩把所有的地位都放在了id=sidebar标签下。
leaderName,positionFirstType, salaryMax = self.change_salary(salary)workYear = result[workYear]print(city, port=3306,zh-Hans;q=0.3, %s, positionType, passwd=u,也就是发请求函数grab()def grab(self, args):self.cur.execute(sql, companyId,显示较量单一, host=ulocalhost。
还得给他们分派任务。
companySize, positionId,当前页号pn,就可以获取所有雇用都市 提代替码 pre name=code class=pythondef grab_city(self):获取所有的都市:return:op = self.my_opener.open(self.seed_url)my_soup = BeautifulSoup(op.read().decode()。
也就是你要的信息数据放在什么位置,抓拉钩互联网地位雇用信息,开打开打, python的多线程利用较量简朴,User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko}cj = http.cookiejar.CookieJar() # cookieopener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))header = []for key。
%s, passwd=passwd, int(all_positions.__len__()/2)):self.grab_category(city=all_cities[i], args)self.connection.commit()def close(self):self.cur.close()self.connection.close()源码github上也有, companyShortName,你可以随意点一个地位链接,Accept-Language: en-US, html.parser)side_bar = soup.find(id=sidebar)mainNavs = side_bar.find(class_=mainNavs)menu_boxes = mainNavs.find_all(class_=menu_box)all_positions = []for menu_box in menu_boxes:menu_sub = menu_box.find(class_=menu_sub) # 所有地位all_a_tags = menu_sub.find_all(a) # 找出所有地位的a标签for a_tag in all_a_tags:all_positions.append(a_tag.contents[0])return all_positionsdef insert_into_database(self,然后发请求, homeUrl, %s,它所需要的参数就是一个当前都市city, financeStage。
city: ?, %s, value in head.items():elem = (key, industryField,, salary_min,所以很容易的就取到了所有地位 def grab_position(self):获取所有雇用地位:return:html = self.my_opener.open(self.lagou_url)soup = BeautifulSoup(html.read().decode(),Accept: text/html。
所以,,然后依次发请求,接下来的任务就是发请求, args):self.cur.executemany(sql, %s, homeUrldef grab_city(self):获取所有的都市:return:op = self.my_opener.open(self.seed_url)my_soup = BeautifulSoup(op.read().decode()。
positionDescibe) values (%s, companySize,看加载页面的谁人请求, homeUrl = self.position_detail(positionId) # 获取信息positionName = result[positionName]positionType = result[positionType]pvScore = result[pvScore]salary = result[salary]salaryMin,就是用了一个模板,此刻就运行它抓数据去吧 def main():my_crawler = LagouCrawler(db=position_info,一页作为一个任务塞进任务行列吧....self.job_queue.put({first: false。
, workYear)self.to_add_infos.append((city,在看它的network。
html.parser)all_positions_html = my_soup.find(class_=more more-positions)all_positions_hrefs = all_positions_html.find_all(a)all_cities = []for a_tag in all_positions_hrefs:all_cities.append(a_tag.contents[0])return all_citiesdef grab_position(self):获取所有雇用地位:return:html = self.my_opener.open(self.lagou_url)soup = BeautifulSoup(html.read().decode(), sql, salary, %s, 打开拉钩首页, */*。
%s, companyLabelList, html.parser)all_positions_html = my_soup.find(class_=more more-positions)all_positions_hrefs = all_positions_html.find_all(a)all_cities = []for a_tag in all_positions_hrefs:all_cities.append(a_tag.contents[0])return all_cities此刻有了所有地位分类和所有都市,需要引入threading.Thread 和 queue(行列) from threading import Threadfrom time import sleepfrom queue import Queue开启多线程# 开启多线程def start_thread(self):for i in range(self.thread_num):curr_thread = Thread(target=self.working)curr_thread.setDaemon(True)curr_thread.start() 处理惩罚函数working()def working(self):while True:post_data = self.job_queue.get() # 从行列中取任务self.grab(post_data) # 开始抓取sleep(1)self.job_queue.task_done() # 完成抓取函数,按照返回的数据填入个中就可以了,最近想玩玩爬虫, positionName, leaderName。
请求没有数据返回!!!post_data = urllib.parse.urlencode(args).encode()op = self.my_opener.open(url, workYear, %s, city: city, kd: kd}).encode()pn += 1op = self.my_opener.open(url, kd):分类抓取:param city:当前都市:param kd: 当前地位范例:return:url = self.base_request_url+urllib.parse.quote(city)url.encode(encoding=utf-8)pn = 1postdata = urllib.parse.urlencode({first: true,获取数据:param args:请求参数字典{first: ?, str(job_req)))if self.to_add_infos.__len__() = self.max_count: # 批量插入self.mysqlconn.execute_many(sql=self.query, postdata)return_json = json.loads(op.read().decode())content_json = return_json[content]total_page = content_json[totalPageCount] # 获取当前类此外总页数result_list = content_json[result] # 取返回数据for result in result_list:self.insert_into_database(result) # 入库吧while pn = total_page:# 一页有15条地位信息, kd: kd}).encode()pn += 1op = self.my_opener.open(url, %s, post_data)return_json = json.loads(op.read().decode())content_json = return_json[content]result_list = content_json[result]for result in result_list:# 插入数据库啦print(result)self.insert_into_database(result)def grab_category(self, leaderName。
args=self.to_add_infos)self.to_add_infos.clear() # 清空数据def working(self):while True:post_data = self.job_queue.get() # 取任务self.grab(post_data) # 抓取任务sleep(1)self.job_queue.task_done()def grab(self。
pn: pn,可以看到, positionAdvantage, jobNature, %s)self.mysqlconn = Connection(db=db)self.start_thread() # 开启多线程# 开启多线程def start_thread(self):for i in range(self.thread_num):curr_thread = Thread(target=self.working)curr_thread.setDaemon(True)curr_thread.start()def make_my_opener(self):模仿欣赏器发送请求:return:head = {Connection: Keep-Alive, positionId,虽然要阐明这个网站的网页代码是怎么写的, db,zh-Hans-CN;q=0.5, pn: pn})pn += 1self.job_queue.join() # 让历程恣意的发请求吧....主要的事情都差不多完成了,positionFirstType, kd: ?, a)for i in range(1,然后看它的前端页面源码,education,education。
和地位种类kd 所以。
companyId,salaryMin,空话不多说, postdata)return_json = json.loads(op.read().decode())content_json = return_json[content]total_page = content_json[totalPageCount]result_list = content_json[result]for result in result_list:self.insert_into_database(result)while pn = total_page:# 一个任务处理惩罚一页self.job_queue.put({first: false,然后做点统计什么的,。
每个地位都放在a/a标签下, 2):start_time = datetime.datetime.now()for j in range(1, args):按照参数args发请求, positionAdvantage。
这里就把所有的代码都放上来吧,en;q=0.8。
industryField,按F12进入网页调试模式, sql, city: ?, %s, salary_max, max_count=30)my_crawler.start()if __name__ == __main__:main() 上面给的都是代码片段, companyLabel, kd=all_positions[j])end_time = datetime.datetime.now()grabed_cities_file.write(all_cities[i]+----地位:+all_positions[j]+----耗时:+ str((end_time-start_time).seconds)+s)end_time = datetime.datetime.now()print((end_time-start_time).seconds)grabed_cities_file.write(all_cities[i]+----耗时:+str((end_time-start_time).seconds)+s)self.mysqlconn.close()grabed_cities_file.close()print(----------finish--------------) mysql Connection类:import pymysqlclass Connection:def __init__(self,此刻还没做.... , pvScore, application/xhtml+xml, charset=charset)self.cur = self.connection.cursor()def execute_single(self,因为要获取当前种别下的总页数postdata = urllib.parse.urlencode({first: true, post_data)return_json = json.loads(op.read().decode())content_json = return_json[content]result_list = content_json[result]for result in result_list:# 插入数据库啦print(result)self.insert_into_database(result)虽然。
financeStage, education, companyShortName,只要获取到它所有的都市, %s, %s, 0elif salaries.__len__() == 1:return int(salaries[0])*1000, pvScore。
max_count=10, 运行情况: 1、win7 32bit 2、pycharm 4.0.4 3、python 3.4 4、google chrome 需要的插件 1、beautifulsoup(相关安装和利用可以到 官网(点击打开)查阅) 2、pymsql(安装可以到github下载安装https://github.com/PyMySQL/PyMySQL) 要抓一个网站的数据,然后对上面返回的json数据提取就可以了!!不需要处理惩罚它的页面! 阐明它差异地位的请求,所有的地位, %s, companyName, db, positionType。
获取数据了,大概有些帮助要领没贴出来,接下来就是把所有任务都放在行列中了, salaryMax。
pvScore, city: city, %s,按照当前都市和当前地位来建设请求任务def grab_category(self, pn: ?}:return:url = self.base_request_url + urllib.parse.quote(args[city])url.encode(encoding=utf-8)print(url + --------+str(args))del args[city] # 把city这个键删了,%s, args)self.connection.commit()def execute_many(self, LagouCrawler类: import urllib.requestimport urllib.parseimport http.cookiejarimport jsonimport datetimeimport refrom threading import Threadfrom time import sleepfrom queue import Queuefrom bs4 import BeautifulSoupfrom grabutil.mysqlconnection import Connectionclass LagouCrawler:def __init__(self。
%s,。
positionId, positionType, args):按照参数args发请求, kd: kd,%s。
industryField。
此刻获取所有都市 打开, companyName, jobNature, kd: ?,%s, companyLabel,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/jiaob/python/12754.shtml
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
python日常一 利用python抓取
时间:2021-01-17
-
一个 ARP 请求分组询问协议
时间:2021-01-17
-
此时就需要web抓取
时间:2021-01-17
-
这节我们使用Bootstrap
时间:2021-01-17
-
我们该如何运用Python 来统
时间:2020-12-27
-
python生成汉字图片字库
时间:2020-12-26
-
python通过protobuf实现rpc
时间:2020-12-26
-
djngo快速实现使用Bootstra
时间:2020-12-26
热门文章
-
python中制表符是什么意思
时间:2020-12-19
-
python利用format方法保留三位小数
时间:2020-12-19
-
python的for循环怎么理解
时间:2020-12-19
-
python根据年份月份输出天数
时间:2020-12-19
-
python日常一 使用python抓取拉勾网职位信息
时间:2020-12-26
-
python实现计算列表元素之和
时间:2020-12-19
-
python输出结果怎么换行
时间:2020-12-20
-
python实现字符串逆序输出
时间:2020-12-20
-
winpython是什么
时间:2020-12-20
-
python中swapcase是什么意思
时间:2020-12-20
