练字用什么笔,关于文明的手抄报,扈忠汉
最近刚学习python,做了个简单的爬虫,作为一个简单的demo希望帮助和我一样的初学者。
代码使用python2.7做的爬虫 抓取51job上面的职位名,公司名,薪资,发布时间等等。
直接上代码,代码中注释还算比较清楚 ,没有安装mysql需要屏蔽掉相关代码:
#!/usr/bin/python # -*- coding: utf-8 -*- from bs4 import beautifulsoup import urllib import urllib2 import codecs import re import time import logging import mysqldb class jobs(object): # 初始化 """docstring for jobs""" def __init__(self): super(jobs, self).__init__() logging.basicconfig(level=logging.debug, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s') #数据库的操作,没有mysql可以做屏蔽 self.db = mysqldb.connect('127.0.0.1','root','rootroot','mysql_test',charset='utf8') self.cursor = self.db.cursor() #log日志的显示 self.logger = logging.getlogger("sjk") self.logger.setlevel(level=logging.debug) formatter = logging.formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler = logging.filehandler('log.txt') handler.setformatter(formatter) handler.setlevel(logging.debug) self.logger.addhandler(handler) self.logger.info('初始化完成') # 模拟请求数据 def jobshtml(self, key, page='1'): try: self.logger.info('开始请求第' + page + '页') #网页url searchurl = "https://search.51job.com/list/040000,000000,0000,00,9,99,{key},2,{page}.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2c0&radius=-1&ord_field=0&confirmdate=9&fromtype=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=" user_agent = 'mozilla/5.0 (macintosh; intel mac os x 10.13; rv:59.0) gecko/20100101 firefox/59.0' #设置请求头 header = {'user-agent': user_agent, 'host': 'search.51job.com', 'referer': 'https://www.51job.com/'} #拼接url finalurl = searchurl.format(key=key, page=page) request = urllib2.request(finalurl, headers=header) response = urllib2.urlopen(request) #等待网页加载完成 time.sleep(3) #gbk格式解码 info = response.read().decode('gbk') self.logger.info('请求网页网页') self.decodehtml(info=info, key=key, page=page) except urllib2.httperror as e: print e.reason # 解析网页数据 def decodehtml(self, info, key, page): self.logger.info('开始解析网页数据') #beautifulsoup 解析网页 soup = beautifulsoup(info, 'html.parser') #找到class = t1 t2 t3 t4 t5 的标签数据 ps = soup.find_all(attrs={"class": re.compile(r'^t[1-5].*')}) #打开txt文件 a+ 代表追加 f = codecs.open(key + '.txt', 'a+', 'utf-8') #清除之前的数据信息 f.truncate() f.write('\n------------' + page + '--------------\n') count = 1 arr = [] #做一些字符串的处理,形成数据格式 ios开发工程师 有限公司 深圳-南山区 0.9-1.6万/月 05-16 for pi in ps: spe = " " finalstr = pi.gettext().strip() arr.append(finalstr) if count % 5 == 0: #每一条数据插入数据库,如果没有安装mysql 可以将当前行注释掉 self.connectmysql(arr=arr) arr = [] spe = "\n" writestr = finalstr + spe count += 1 f.write(writestr) f.close() self.logger.info('解析完成') #数据库操作 没有安装mysql 可以屏蔽掉 def connectmysql(self,arr): work=arr[0] company=arr[1] place=arr[2] salary=arr[3] time=arr[4] query = "select * from jobs_tab where \ company_name='%s' and work_name='%s' and work_place='%s' \ and salary='%s' and time='%s'" %(company,work,place,salary,time) self.cursor.execute(query) queryresult = self.cursor.fetchall() #数据库中不存在就插入数据 存在就可以更新数据 不过我这边没有写 if len(queryresult) > 0: sql = "insert into jobs_tab(work_name,company_name,work_place,salary\ ,time) values('%s','%s','%s','%s','%s')" %(work,company,place,salary,time) try: self.cursor.execute(sql) self.db.commit() except exception as e: self.logger.info('写入数据库失败') #模拟登陆 # def login(self): # data = {'action':'save','isread':'on','loginname':'18086514327','password':'kui4131sjk'} # 开始抓取 主函数 def run(self, key): # 只要前5页的数据 key代表搜索工做类型 这边我是用的ios page是页数 for x in xrange(1, 6): self.jobshtml(key=key, page=str(x)) self.logger.info('写入数据库完成') self.db.close() if __name__ == '__main__': jobs().run(key='ios')
这样抓取网页数据格式如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
新手学习Python2和Python3中print不同的用法
Python基于os.environ从windows获取环境变量
网友评论