您的位置:首页 > 编程语言 > Python开发

用python写的一次爬虫经历

2017-06-28 09:29 435 查看
昨晚帮朋友到一个天津校园信息网站抓天津小学名称、地址等信息,里面的坑还是不少,记录一下。

Python版本用的是2.7

网址:http://tianjin.xuexiaodaquan.com/xiaoxue

该网站的网页并没有采用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 = '<p><a href(.*?)>(.*?)</a></p>'
namePattern = re.compile(reg)
nameList = namePattern.findall(html)
return nameList

def GetSchoolPhone(html):
reg = '<li><i>电话:</i><span>(.*?)</span>'
phonePattern = re.compile(reg)
phoneList = phonePattern.findall(html)
return phoneList

def GetSchoolAddress(html):
reg = '<li><i>地址:</i><span>(.*?)</span>'
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")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  爬虫 python