Python爬虫碎碎念

最近领导给了一个任务,从单位的数据库里面导出所有的数据,存到本地excel表格。我就想,这不挺简单的么,给我数据库的密码账户,几条语句搞定。

结果让人大失所望,单位数据库只能通过后台管理系统查看,平台压根不提供批量导出功能,至于数据库直接访问什么的,更是想都别想,大领导不给批。

所以,只能采取笨办法了,网络爬虫给爬下来!

于是乎,重拾丢弃了大半年的python。开始钻研如何写一个简单的小爬虫。

python写爬虫的思路其实很简单。下面简单说下

1)python模拟登录。主要是获取cookie~

2)分析与平台交互过程中http包所含的数据特点。主要就是请求和响应。

这个平台诡异的地方在于,要想提取数据,并不是一次到位。首先,得获取大的列表,列表会有分页,然后,点进列表中的每一项查看详情。

通过对来往http包的分析,其流程大致如下:

模拟登录->发起获取列表请求(post, json)->返回列表数据(json)->发起获取详情请求(get)->返回详情页面(html)

完整的数据需要拼合列表数据和详情页面数据。前者,只需解析json数据既可,但是后面的详情页面,得对html页面进行解析,提取所需项。

流程并不复杂,但是写起来坑却太多。此文着力记录踩过的坑。主要是两大坑。

坑No1:蛋疼的python编码方式

这个坑可以分为几个小问题来解答

1)unicode和utf-8是什么关系?

这个问题,知乎上有一句话解释挺好的,那就是:utf8是对unicode字符集进行编码的一种编码方式。

unicode字符集本身是一种映射,它将每一个真实世界的字符与某一数值联系在一起,是一种逻辑关系。utf-8则是编码方式,是对unicode所代表的值进行编码的算法。

简单地说,就是:字符->unicode->utf-8

例如:中文“你好” -> \u4f60\u597d -> \xe4\xbd\xa0\xe5\xa5\xbd

2)str和unicode又是什么关系?

str和unicode是python2.X里面的概念。

例如 s=u‘你好‘

s变量就是一个unicode字符串,是一个unicode对象(type(s) == unicode)

其中len(s) = 2

存储的值为\u4f60\u597d。

至于str,则是python最原始的数据流。可以理解为字节流,即二进制码。

Python has two different datatypes. One is ‘unicode‘ and other is ‘str‘.

Type ‘unicode‘ is meant for working with codepoints of characters.

Type ‘str‘ is meant for working with encoded binary representation of characters.

以上述“你好”为例,其unicode是\u4f60\u597d。这个值还可以进行一次utf-8的编码,最终成为存储的字节流,也就是\xe4\xbd\xa0\xe5\xa5\xbd

在python3中,所有的str都变成了unicode,3中bytes则替代了2.X中的str

stackoverflow有一个解答说的挺好http://stackoverflow.com/questions/18034272/python-str-vs-unicode-types

unicode, which is python 3‘s str, is meant to handle text. Text is a sequence of code points whichmay be bigger than a single byte. Text can be encoded in a specific encoding to represent the text as raw bytes(e.g. utf-8latin-1...). Note that unicode is not encoded! The internal representation used by python is an implementation detail, and you shouldn‘t care about it as long as it is able to represent the code points you want.

On the contrary str is a plain sequence of bytes. It does not represent text! In fact, in python 3 str is called bytes.

You can think of unicode as a general representation of some text, which can be encoded in many different ways into a sequence of binary data represented via str.

Note that using str you have a lower-level control on the single bytes of a specific encoding representation, while using unicode you can only control at the code-point level.

如此,便很明了了~

3)encode和decode的使用方法。

有了上述两点的基础,这里的使用方法就不难了。

所谓encode,就是unicode->str,有意义的文字,变为字节流。

而decode,就是str->unicode,字节流,变为有意义的文字。

decode对str使用,encode对unicode使用。

例如:

u_a=u‘你好‘   #这里是unicode字符

u_a   #输出u‘\u4f60\u597d‘

s_a = u_a.encode(‘utf-8‘)  #对u_a进行utf-8编码,转化为字节流

s_a   #输出‘\xe4\xbd\xa0\xe5\xa5\xbd‘

u_a_ = s_a.decode(‘utf-8‘) #对s_a进行utf-8解码,还原为unicode

u_a_  #输出u‘\u4f60\u597d‘

utf-8是一种编码方法,此外,常见的还有gbk等等。

4)#coding:utf-8和setdefaultencoding有什么区别?

#coding:utf-8作用是定义源代码的编码,如果没有定义,此源码中不可以包含中文字符。

setdefaultencoding是python代码在执行时,unicode类型数据默认的编码方式。(Set the current default string encoding used by the Unicode implementation.)这是因为,unicode有很多编码方式,包括UTF-8、UTF-16、UTF-32,中文还有gbk。在调用decode和encode函数时,在不显示指定参数的情况下,就会采用上述默认的编解码方式。

需要注意的是,在windows下的idle中,在不显式指出u前缀的前提下,会默认采用gbk编码。

下面看一个例子:

a = ‘你好‘  #在windows下的idle里面,a是gbk编码
a    #输出‘\xc4\xe3\xba\xc3‘ 这是gbk
b = a.decode(‘gbk‘)  #进行gbk解码为unicode
b    #输出u‘\u4f60\u597d‘
print b  #输出 你好
b = a.decode() #在不指定参数情况下,默认采用ascii编解码,此时会报错,
               #UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte
a = u‘你好‘
b = a.encode() #同理,也会报错
               #UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters

坑No2:繁杂的正则表达式(待续)

时间: 2024-10-19 16:13:45

Python爬虫碎碎念的相关文章

一个十二年老程序猿的碎碎念h5牛牛程序出售

我是一名程序猿,在上95年上初中的时候h5牛牛程序出售(http://h5.hxforum.com) 联系方式170618633533企鹅2952777280 源码出售 房卡出售 后台出租有意者私聊扣扣,别的还在都在打篮球.踢足球的时候,我就已经在玩QBasic了,每逢跟其他程序猿说起这段的时候,大家都会投过来羡慕的眼光,其实没有你们想的那么好,反而挺悲催的,当时的同学们都不知道我在说些啥,另外我至今都不会打篮球.踢足球.果然不出意外(不会有意外的,我大学填报的所有志愿都是计算机系)的大学毕业后

工作中的感悟 (三)三个月碎碎念篇

感慨一下来这里工作已经有一个月了,从最初的不是很适应这里的节奏,到慢慢适应了这里的生活,中间的过程就像经过一场暴风雨的洗礼虽然说的有点夸张,但是也是差不多吧,同在学校比要累很多,不过坚信不管再累.也要坚持既然有人有干,那我们就可以干我们没有什么理由坚持不了.别人可以做到的我们一样可以做到. 刚来的时候以一种无所谓.既兴奋又有很多好奇的心态来到了北京,这里很多人梦想的地方,不禁感慨以后我也在北京这里开始了这里的生活,时间长了究竟会是怎样一种心境呢,据说这里压力大.这里消费高.这里租房忒别烦人,来到

一些关于Linux入侵应急响应的碎碎念

近半年做了很多应急响应项目,针对黑客入侵.但疲于没有时间来总结一些常用的东西,寄希望用这篇博文分享一些安全工程师在处理应急响应时常见的套路,因为方面众多可能有些杂碎. 个人认为入侵响应的核心无外乎四个字,顺藤摸瓜.我们常常需要找到比较关键的信息后通过一些指令查询或者分析日志,逐步分析黑客的具体步骤. 入侵后需要被关注的Linux系统日志 var/log/cron 记录crontab命令是否被正确的执行,一般会被黑客删除 var/log/lastlog 记录登录的用户,可以使用命令lastlog查

【碎碎念】百度前端技术学院春季班

早上迷迷糊糊被读研阶段的室友的微信叫醒了,邀约组队参加百度前端技术学院春季班(http://ife.baidu.com/),前室友在前端方面还是有一定造诣的,自己本身对前端开发又有一定兴趣,因此准备组团参与下. 想想我的技能树长得确实有点奇葩,最早是做嵌入式的,做了三个月点唱机跑去做产品和实施,跑完了大半个福州高校做某系统推广与实施后觉得做开发的童鞋的Bug有点多就边实施边改代码,久而久之就慢慢转向了开发,想想读研阶段白天上班写C#晚上下班写实验室的Java横向项目的经验也是蛮奇葩的,导致现在我

碎碎念

最近心情莫名的低落,明天就要上班了,希望紧张的生活节奏能让我的生活充实起来. 碎碎念,布布扣,bubuko.com

Oracle碎碎念

1. 设置SQL*Plus提示符 SQL> set sqlprompt "_user'@'_connect_identifier>" [email protected]> 为了对所有的SQL*Plus会话自动设置sqlprompt,将上面的命令放置在ORACLE_HOME/sqlplus/admin目录中的glogin.sql文件内 2. 查看角色RESOURCE被授予的系统权限 SQL> select * from dba_sys_privs where gr

Suse碎碎念

1. 如何查看Suse的版本号 vmpbos01:~ # lsb_release -d Description: SUSE Linux Enterprise Server 11 (x86_64) Suse碎碎念,布布扣,bubuko.com

OCS 2007与Lync 2013的一点碎碎念

最近的项目,跨度都比较大.这次碰上的是OCS2007升级Lync 2013.以下记录一些过程心得(吐槽),类似那篇<2003到2012>的博文. 最开始的计划是OCS2007(不带R2)全部推倒干净,然后启Lync2013.商量来商量去,怕推不干净的话,Lync2013部署会有问题.于是就想着OCS2007迁到R2再迁到Lync2013. 这时候一个非常屌的问题出现了! 原有OCS2007是企业版带有后端数据库,客户对于Lync2013企业版的价格有点唏嘘,需求也不高遂只要用标准版-那么-标准

工作一周年碎碎念

去年7月3日入职公司到现在,马上就要一周年了,觉得有必要写篇文章唠叨下. 期间在部门内转了一次组(那次换组可以看我之前那篇入职一个半礼拜写的文章,当时其实蛮失意的),现在又马上要转去另一个部门,自我评价算是比较爱折腾的:),可能比较好的做法是卡下述职评级时间再考虑换岗,哈哈.我在考虑换个环境的时候,单纯就是冲着技术方向和氛围走的,其实现在组里的同事.经理都非常nice,关系也蛮融洽,工作强度也不强,除了项目之外也腾得出自己的时间,照理说没必要换部门.但是总体感觉现在工作氛围有点轻松,技术氛围离我

Jerry的碎碎念:SAPUI5, Angular, React和Vue

去年我去一个国内客户现场时,曾经和他们IT部门的一位架构师聊到关于在SAP平台上进行UI应用的二次开发时,UI框架是选用UI5还是Vue这个话题. 我们代表SAP, 向客户推荐使用UI5是基于以下六点原因: Fiori consists of a large number of UI controls aimed at Enterprise application developed by top JavaScript developers in SAP. Those UI controls p