用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里面,这里需要注意的是,如果存储的信息是汉字,那么在创建工作空间的时候应指明编码方式,并指定字体:
最后,由于数据是采用分页的形式展示,而每页的url都是有规律的,所以可以根据规律拼接url,循环遍历爬取即可,附上完整代码:
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爬虫爬取p站的经历
- 当Httpclient遇到线程池(记一次爬虫经历)
- 一次Python爬虫的修改,抓取淘宝MM照片
- 19个Python爬虫项目让你一次吃到撑
- 记一次node编写爬虫的经历
- python爬虫框架scrapy一次执行多个爬虫文件
- 【python爬虫学习经历一】
- 32个Python爬虫项目让你一次吃到撑
- 用Python对KSC数据集处理的一次排错经历
- 一个Python小白5个小时爬虫经历
- 记一次python+selenium+chrome爬虫
- 一次python序列化与反序列化自有协议的经历
- 一个Python小白5个小时爬虫经历
- python 记一次计算qzonetoken经历
- 一个Python小白5个小时爬虫经历
- python 记一次将数据库查询结果写入到表格经历
- 记录一次爬虫经历
- 一个Python小白5个小时爬虫经历
- 资源整理 |19个Python爬虫项目让你一次吃到撑
- 记一次坑爹的爬虫经历