主要记录一下前段时间在MOOC上学的python网络爬虫课程的学习内容,以及用于大一项目的豆瓣电影评论爬虫实践。
Request库的基本使用
response对象的属性
response对象 | 属性 |
---|---|
r.status_code | http请求的返回状态,状态码 |
r.text | url对应的页面内容 |
r.encoding | 从http header中猜测的页面内容的编码方式 |
r.apparent_encoding | 从页面内容分析出的响应内容的编码方式 |
r.content | http响应内容的二进制形式 |
通用代码框架
1 | Import requests |
requests.get()方法
1 | r = requests.get(url, **kwargs) |
get函数共有十三个控制访问的参数,常用的参数如下:
控制参数 | 数据类型 | 功能 |
---|---|---|
params | 字典或者字节序列 | 作为参数增加到url中 |
headers | 字典 | http定制头,模拟浏览器访问 |
cookies | 字典 | 添加访问cookie |
timeout | - | 设定超时时间 |
proxies | 字典 | 设置代理IP |
BeautifulSoup库的基本使用
初始化解析
1 | from bs4 import BeautifulSoup |
BeautifulSoup库的理解
例子:
1 | <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1"> |
name&parent
1 | soup.a.name |
attrs
1 | tag = soup.a |
string
1 | tag.string |
标签树的遍历
上行遍历
最常用,后面的遍历其实不太用。即上文提到的parent和parents用法,此处不赘述。
举例:
1 | soup = BeautifulSoup(demo, "html.parser") |
下行遍历
属性 | 说明 |
---|---|
soup.a.contents | a标签所有子节点存入的列表 |
soup.a.children | 子节点的迭代类型,用于循环遍历儿子节点 |
soup.a.descendants | 子孙节点的迭代类型,包含所有子孙节点 |
举例
1 | soup.head.contents |
平行遍历
属性 | 说明 |
---|---|
.next_sibling | 返回按照HTLML文本顺序的下一个平行节点标签 |
.previous_sibling | 返回按照HTML文本顺序的上一个平行节点标签 |
.next_siblings | 迭代类型,返回按照HTLML文本顺序的后续所有平行节点标签 |
.previous_sibling | 返回按照HTML文本顺序的前续所有平行节点标签 |
find函数
主要用法:
1 | #find_all() 返回列表 |
简化写法:
1 | <tag>(...)等价于<tag>.find_all(...) |
正则表达式及re库
正则表达式的语法
由字符和操作符构成
常用操作符:
操作符 | 说明 | 示例 |
---|---|---|
. | 表示任何单个字符 | |
[] | 字符集,对单个字符给出取值范围 | [abc]表示a、b、c,[a-z]表示a到z单个字符 |
[^] | 非字符集,对单个字符给出排除范围 | [^abc]表示非a或b或c的单个字符 |
* | 前一个字符0次或无限次扩展 | abc*表示ab, abc, abcc, abccc等 |
+ | 前一个字符1次或无限次扩展 | abc+表示abc, abcc, abccc等 |
? | 前一个字符0次或1次扩展 | abc?表示ab, abc |
竖杠 | 左右表达式任意一个 |
操作符 | 说明 | 示例 | |
---|---|---|---|
{m} | 扩展前一个字符m次 | ab{2}c表示abbc | |
{m,n} | 扩展前一个字符m至n次 | ab{1,2}表示abc, abbc | |
^ | 匹配字符串开头 | ^abc表示abc且在一个字符串的开头 | |
$ | 匹配字符串结尾 | abc$表示abc且在一个字符串的结尾 | |
() | 分组标记,内部只能使用\ | 操作符 | (abc)表示abc |
\d | 数字,等价于[0-9] | ||
\w | 单词字符,等价于[A-Za-z0-9] |
经典正则表达式实例 :
正则表达式语法实例
Re库的基本使用
Re库主要功能函数
函数 | 说明 |
---|---|
re.search() | 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象 |
re.match() | 从一个字符串的开始位置起匹配正则表达式,返回match对象 |
re.findall() | 搜索字符串,以列表类型返回全部能匹配的字串 |
re.split() | 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型 |
re.finditer() | 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象 |
re.sub() | 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串 |
Match对象的属性
属性 | 说明 |
---|---|
.string | 待匹配的文本 |
.re | 匹配时使用的pattern对象(正则表达式) |
.pos | 正则表达式搜索文本的开始位置 |
.endpos | 正则表达式搜索文本的结束位置 |
Match对象的方法
方法 | 说明 |
---|---|
.group(0) | 获得匹配后的字符串 |
.start() | 匹配字符串在原始字符串的开始位置 |
.end() | 匹配字符串在原始字符串的结束位置 |
.span() | 返回(.start(), .end()) |
最小匹配操作符
操作符 | 说明 |
---|---|
*? | 前一个字符0次或无限次扩展,最小匹配 |
+? | 前一个字符1次或无限次扩展,最小匹配 |
?? | 前一个字符0次或1次扩展,最小匹配 |
{m,n}? | 扩展前一个字符m至n次(含n),最小匹配 |
示例
1 | #.group(0)用法 |
Scrapy爬虫框架
emmmm由于实践中还没有应用这个爬虫框架,所以不怎么了解,先挖坑吧,以后来补上。
豆瓣Top250电影评论爬虫
思路
鉴于大一项目需要豆瓣的电影评论数据做情感分析,只好现学现用。豆瓣并没有提供能找到所有电影url链接的页面,所以只好先用top250试试水,后面再想办法爬取更多的电影。
1.前期工作:
- 人工分析top250和每部电影url的组成规律
- 人工解析目标在页面的位置、标签名称等
2.主要思路:
- 从top250页面爬取每部电影的链接
- 通过该电影链接进入评论页面,获得电影名称,通过改变url参数实现翻页爬取500条评论(需要cookie)
3.难点:
豆瓣的反爬虫机制真的被练出来了。。。每部电影只能显示500条短评,况且还必须登录,否则只能显示200条。说到登录,只能同时登录一个账号(账号还必须用手机号绑定注册),用一个cookie,而且在设置时间延迟的基础上爬十多部电影就会被冻结账号。这个时候,不像网上说的只需要识别验证码了,而是需要手动发短信,修改密码重新登录,再重新复制新的cookie继续爬。另外,从一个免费提供代理ip地址的网站上找了几个代理ip做ip池,每次随机使用一个代理ip。就这样断断续续爬了几天,终于爬好了惹。
代码
emmm没有写注释😂,下次注意。
1 | #!/usr/bin/env python3 |