爬虫自学——day1

爬取dangdangTOP500书籍遇到的知识点

我们认为HTML类——标签树——BeautifulSoup类,这三者是等价的

python中的group方法
group()在正则表达式中用于获取分段截获的字符串,解释如下代码(代码来自网络):

import re
a = “123abc456”
print re.search("([0-9])([a-z])([0-9])",a).group(0) #123abc456,返回整体
print re.search("([0-9]
)([a-z])([0-9])",a).group(1) #123
print re.search("([0-9])([a-z])([0-9])",a).group(2) #abc
print re.search("([0-9]
)([a-z])([0-9])",a).group(3) #456

人民币的HTML写法:¥

yield函数的用法:https://blog.csdn.net/u011318077/article/details/93749143
yield和return的区别,return执行后会继续执行后面的代码,但是yield会停止之后的代码继续执行,注意,只是停止生成器函数内部的代码,生成器函数外部代码不受影响

generator就是一个特殊类型的迭代器(iterator)和迭代器相似,我们可以通过使用next()来从generator中获取下一个值

if name == 'main’的意思是:当.py文件被直接运行时,if name == 'main’之下的代码块将被运行;当.py文件以模块形式被导入时,if name == 'main’之下的代码块不被运行。

response.text
类型:str
解码类型:根据HTTP头部响应的编码做出有根据的推测,推测的文本编码。
改变编码的方式:response.encoding=”gbk”
用途:response.text返回的是Unicode型数据;一般用来获取文本response.text;
response.content
类型:bytes
解码类型:没有指定
修改编码的方式:response.content.decode(“utf8”)
用途:response.content返回的是bytes类型,也就是二进制数据;用来获取图片,文件response.content

在对爬取的信息进行解析时需要通过pattern=re.compile来进行封装

正则 re.findall 的简单用法(返回string中所有与pattern相匹配的全部字串,返回形式为数组)

Json简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。
它的格式一般是这样的:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
使用Python编码和解析Json
Python内置了json包来帮助我们完成对json的操作。
将Python的字典结构导出到json使用json.dumps() ,将json读成Python的字典结构,使用json.loads() 。
如果不是针对string操作而是对文件操作,分别使用json.load()函数和json.dump()函数。
json.dumps()自动返回json格式的数据

对于输出真正的中文需要指定ensure_ascii=False

对yield生成列表的进一步探究

一个函数中如果存在yield关键字,那这个函数就是一个生成器
生成器(constructor)
生成器函数在Python中与迭代器协议的概念联系在一起。简而言之,包含yield语句的函数会被特地编译成生成器。当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。函数也许会有个return语句,但它的作用是用来yield产生值的。
不像一般的函数会生成值后退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效。解析获取到一页信息后,我们需要将信息处理一下,遍历提取结果并生成字典,这样的目的是为了将数据结构整齐(不然的话,数据比较乱),便于后面存储数据。
在这里,我用了生成器函数,每调用一次函数时,将会返一个迭代对象,这个迭代对象里面包含一页的所有信息

BeautifulSoup

在这里插入图片描述
因为class是python的保留关键字,若要匹配标签内class的属性,需要特殊的方法,有以下:
BeautifulSoup自带的特别关键字class_

找出问题所在

xlsx后缀的excel表格打不开,可能是版本问题,改成xls后缀就ok了
豆瓣的反爬虫较强,需要设置User-Agent头,并将timeout设置才行,不然会出现意想不到的错误

新建一个excel文件 book = xlwt.Workbook()

为了找到BeautifulSoup对象内任何第一个标签入口,使用find()方法。

获取字典dict中的键所对应的值时,常用到get()方法
find()和get()都不会在找不到时抛出异常

.string可以返回当前节点中的内容,但是当前节点包含子节点时,.string不知道要获取哪一个节点中的内容,故返回空
.text(或者.get_text())可以返回当前节点所包含的所有文本内容,包括当前节点的子孙节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值