python爬虫技术总结_第一个python网络爬虫总结

这个程序其实就是模仿用户的网页访问操作。

先从主页上获取大的商品分类,再一级一级地遍历所有的小分类。在最后得到商品列表,再遍历每个商品页,从商品页是抓取有效的信息。

这里,我对一些关键点做个总结,以便以后用到好回顾。

一,怎么访问网页?

# 根据url获取网页正文

def get_webpage(url):

headers = {\

'User-Agent' : 'Mozilla/5.0 (X11; Linux i686; rv:34.0) Gecko/20100101 Firefox/34.0',\

'Accept'     : 'text/html',\

'Connection' : 'keep-alive'}

try:

request = urllib2.Request(url, None, headers)

response = urllib2.urlopen(request, timeout=120)

webpage = response.read()

response.close()

return webpage

#except urllib2.HTTPError, e:

#    print('HTTPError: ' + str(e.code))

#except urllib2.URLError, e:

#    print('URLError: ' + str(e.reason))

except Exception, e:

print('发生异常: ' + str(e))

上面这个函数就是用uillib2.urlopen()函数获取url网址的网页内容。也可以不用urllib2.Request(),直接用urllib2.urlopen()。这么做为是为了仿造正常的浏览器的访问操作。

二,数据保存

数据最好保存为xls文件格式,如果没有办法保存为csw文本格式也可以,也可以保存为txt文本格式。

最好做成根据用户输入的文件名的后缀名进行自动识别。

(1)先分别定义函数 save_as_csw(), save_as_txt(), save_as_xls() 实现csw,txt,xls文件格式的保存。

def save_as_csw(prod_list, filename):

if len(prod_list) == 0:

return False

#分类 商品 价格 联系人 手机 公司 座机 传真 地址 公司网址 源自网页

line_fmt = '"%s"\t"%s"\t"%s"\t"%s"\t"%s"\t"%s"\t"%s"\t"%s"\t"%s"\t"%s"\t"%s"\n'

lines = []

head_line = line_fmt % ('分类', '商品', '价格', '联系人', '手机号','公司',

'电话', '传真', '公司地址', '公司网址', '源网页')

lines.append(head_line)

for item in prod_list:

info = item['detail']

if info == None:    #如果信息不全,则跳过

continue

prod_line = line_fmt % (item['path'], info['name'], info['price'],\

info['contact'], info['cell-phone'], info['company'], \

info['tel-phone'], info['fax'], info['address'], info['website'], item['url'])

lines.append(prod_line)

wfile = open(filename, 'w')

wfile.writelines(lines)

wfile.close()

return True

def save_as_txt(prod_list, filename):

if len(prod_list) == 0:

return False

#分类 商品 价格 联系人 手机 公司 座机 传真 地址 公司网址 源自网页

line_fmt = '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n'

lines = []

head_line = line_fmt % ('分类', '商品', '价格', '联系人', '手机号','公司',

'电话', '传真', '公司地址', '公司网址', '源网页')

lines.append(head_line)

for item in prod_list:

info = item['detail']

if info == None:    #如果信息不全,则跳过

continue

prod_line = line_fmt % (item['path'], info['name'], info['price'],\

info['contact'], info['cell-phone'], info['company'], \

info['tel-phone'], info['fax'], info['address'], info['website'], item['url'])

lines.append(prod_line)

wfile = open(filename, 'w')

wfile.writelines(lines)

wfile.close()

return True

#保存数据到xls文件中,每个大类放在不同的Worksheet中

def save_as_xls(prod_list, filename):

if len(prod_list) == 0:

return False

workbook = xlwt.Workbook(encoding='utf-8')  #必须注明编码格式,否则会保存失败

curr_category = ''

worksheet = None

row_index = 0

for prod_item in prod_list:

path = prod_item['path']

this_category = path.split('/')[0]

#如果当前的这个商品种类与上一个商品不同,则要新建worksheet

if this_category != curr_category:

worksheet = workbook.add_sheet(this_category)

curr_category = this_category

#填写表头

header_cells = ('分类', '商品', '价格', '联系人', '手机号','公司',

'电话', '传真', '公司地址', '公司网址', '源网页')

column_index = 0

for cell in header_cells:

worksheet.write(0, column_index, header_cells[column_index])

column_index += 1

#创建了新了worksheet后,数据从第二行开始往下写

row_index = 1

#将数据填写到worksheet的row_index行

prod_info = prod_item['detail']

#如果信息不全,则跳过

if prod_info == None:

continue

prod_cells = (path, prod_info['name'], prod_info['price'], prod_info['contact'],\

prod_info['cell-phone'], prod_info['company'], prod_info['tel-phone'],\

prod_info['fax'], prod_info['address'], prod_info['website'], prod_item['url'])

column_index = 0

for cell in prod_cells:

worksheet.write(row_index, column_index, prod_cells[column_index])

column_index += 1

row_index += 1

pass

workbook.save(filename)

return True

(2)定义DataSaver类,实现统一的文件保存功能。并用 case_dict 根据后缀名进行分别保存。

def get_filename_postfix(filename):

basename = os.path.basename(filename)

temp = basename.split('.')

if len(temp) >= 2:

return temp[-1]

class DataSaver:

#后缀名与保存函数映射表

case_dict = {'csw':save_as_csw,\

'txt':save_as_txt}

if xlwt_enabled:

case_dict['xls'] = save_as_xls

#将商品列表数据‘喂’给DataSaver

def feed(self, data):

self.product_list = data

pass

def save_as(self, filename):

if self.product_list == None or len(self.product_list) == 0:

print('警告:记录为空,不保存')

return

print('正在保存……')

while True:

postfix = get_filename_postfix(filename)

try:

if self.case_dict[postfix](self.product_list, filename):

print('已保存到:' + filename)

else:

print('保存失败!')

break

except KeyError:

print('警告:不支持 %s 文件格式。' % (postfix))

print('支持的文件格式:' + ','.join(self.case_dict.keys()))

try:

filename = raw_input('请输入新文件名:')

except KeyboardInterrupt:

print('用户取消保存')

break

pass

pass

(3)如果没有安装 xlwt ,就不能支持 xls 文件的保存。

这里的做法是:如果import xlwt成功,则将xls文件的保存函数添加到case_dict中。

如果文件格式不支持,就提示让用户另命个文件名进行保存。

#如果没有安装xlwt,那么保存为xls文件就不可用

xlwt_enabled = True

try:

import xlwt

except ImportError:

xlwt_enabled = False

见 DataSaver.save_as() 函数中对 xls 后缀名的处理。

三,遇到的问题与解决方法

(1)python程序里不能有中文的问题。

以前,只有python程序里有中文,不管是在哪儿,都不能运行。原来是python解析器默认将文件识别为ascii编码格式的,有中文当然就不误别。解决这问题的办法是:明确告知解析器我们文件的编码格式。

#!/usr/bin/env python

#-*- coding=utf-8 -*-

这样就可以了。

(2)安装xlwt3不成功的问题。

从网上下载xlwt3进行安装。python setup.py install 失败,报print()函数不支持print("xxxx", file=f)这种格式。我看了一下,这个功能python 2.6是没有的。于是重新下载了xlwt-0.7.5.tar.gz进行安装。结果就可以了。

(3)在Windows为乱码的问题。

这个问题,我还没有解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值