Python语言技术文档

微信小程序技术文档

php语言技术文档

jsp语言技术文档

asp语言技术文档

C#/.NET语言技术文档

html5/css技术文档

javascript

点击排行

您现在的位置:首页 > 技术文档 > Python网络爬虫

python2.7实例教程爬虫网页数据

来源:中文源码网    浏览:276 次    日期:2024-04-22 18:34:37
【下载文档:  python2.7实例教程爬虫网页数据.txt 】


python2.7实现爬虫网页数据
最近刚学习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 = "http://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': 'http://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')
这样抓取网页数据格式如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持中文源码网。

相关内容