python爬虫实验报告怎么写_用python写的一次爬虫经历

昨晚帮朋友到一个天津校园信息网站抓天津小学名称、地址等信息,里面的坑还是不少,记录一下。

该网站的网页并没有采用ajax交互,而是通过服务端渲染整个页面后发送到前端,之前抓数据最简单的就是通过抓包抓到它的数据接口,之后从这个接口取数据就行。现在方式变了,那就用python丰富的库来写个爬虫来抓取。

这里用的是urllib2来返回网页数据,首先遇到就是一个编码问题,通过网页的源码里的charset可以看到写的是GBK,但是这里面的charset并不一定对,需要通过chardet.detect来具体检测,果然,返回的是gb2312编码,so在解码的时候就需要将其先用gb2312的方式解码,再用utf-8的方式编码输出。

抓取信息的正则表达式就不多说了,根据想要抓取的信息的标签格式来书写对应的正则就可以了。

抓取数据后,我们可以用xlwt这个库将抓到的数据存储在EXCEL里面,这里需要注意的是,如果存储的信息是汉字,那么在创建工作空间的时候应指明编码方式,并指定字体:

workbook = xlwt.Workbook(encoding='utf-8')

style = xlwt.XFStyle()

font = xlwt.Font()

font.name = 'SimSun' # 指定“宋体”

style.font = font

最后,由于数据是采用分页的形式展示,而每页的url都是有规律的,所以可以根据规律拼接url,循环遍历爬取即可,附上完整代码:

# -*- coding:utf-8 -*-

import chardet

import urllib2

import re

import xlwt

def GetSchoolName(html):

reg = '

(.*?)

'

namePattern = re.compile(reg)

nameList = namePattern.findall(html)

return nameList

def GetSchoolPhone(html):

reg = '

电话: (.*?)'

phonePattern = re.compile(reg)

phoneList = phonePattern.findall(html)

return phoneList

def GetSchoolAddress(html):

reg = '

地址: (.*?)'

addressPattern = re.compile(reg)

addressList = re.findall(addressPattern, html)

return addressList

workbook = xlwt.Workbook(encoding='utf-8')

sheet = workbook.add_sheet('school', cell_overwrite_ok=True) # 添加表名

style = xlwt.XFStyle()

font = xlwt.Font()

font.name = 'SimSun' # 指定“宋体”

style.font = font

count = 0

for pn in range(1, 37):

if pn == 1:

url = 'http://tianjin.xuexiaodaquan.com/xiaoxue'

else:

url = 'http://tianjin.xuexiaodaquan.com/xiaoxue/pn' + str(pn) + '.html'

html = urllib2.urlopen(url).read()

# print html

mychar = chardet.detect(html)

# print mychar

bianma = mychar['encoding']

if bianma == 'utf-8' or bianma == 'UTF-8':

html = html.decode('utf-8', 'ignore').encode('utf-8')

else:

html = html.decode('gb2312', 'ignore').encode('utf-8')

# print html

# print chardet.detect(html)

get1 = GetSchoolName(html)

get2 = GetSchoolPhone(html)

get3 = GetSchoolAddress(html)

for each in get1:

if each[1] == '':

sheet.write(count + get1.index(each), 0, 0) # row, column, value

else:

print each[1]

sheet.write(count + get1.index(each), 0, each[1]) # row, column, value

for index in range(len(get2)):

if get2[index] == '':

sheet.write(count + index, 1, 0)

else:

sheet.write(count + index, 1, get2[index])

for index in range(len(get3)):

if get3[index] == '':

sheet.write(count + index, 2, 0)

else:

sheet.write(count + index, 2, get3[index])

count += len(get1)

workbook.save("school.xls")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值