【爬虫作业2】正则表达式爬虫
2018-08-13 本文已影响2人
猪猪头看世界
1. 学习任务:正则表达式爬虫
Day 3 观看第二讲视频,了解爬虫原理和requests库的使用
Day 4 观看第二讲视频,学会正则表达式爬虫,完成糗事百科爬虫
2. 学习笔记
2.1 网络连接
老师用“自动贩卖机”形象地介绍了网络连接的过程,即我们从电脑端向服务器发出请求(Request),获得回应(Response)的过程,而网络爬虫,其实也就是模拟了这样一个过程。
网络连接,图片来自于视频教程
2.2 爬虫原理
爬虫简单概括为:请求-筛选-存储,相关流程如下:
爬虫原理,图片来源于视频教程
2.3 Chrome浏览器安装和使用
- Chrome浏览器下载安装与其他浏览器类似。
- 打开常用浏览器,设置修改为启动时打开特定浏览页。此处我的电脑目前可以正常使用chrome浏览器,是否后续爬虫任务直接在Chrome浏览器中进行?
- Chrome使用方法:在页面空白处-右击-查看网页源代码,可查询相关代码,我们会发现包括Html(框架,主要数据),CSS(样式),和Script(功能)三个主要部分。
2.4 Requests库的使用(数据的请求)
- Requests库使用的是Get请求。
- 为防止被绊,一般需要加入请求头。请求头查询:在网页面按F12获取。
- 异常处理。为检查是否被绊时,可查询状态码(res.status_code),该状态码为200时,意味着请求成功。
2.5 Requests库使用实战
## Requests 实战练习1,以小猪短租为例
# 导入库,输入网址,获取url,打印相关信息,可获取网页源代码,当状态码为200时,请求成功
import requests
url = 'https://www.xiaozhu.com/'
res = requests.get(url)
print(res.text)
print(res.status_code)
## Requests 实战练习2,糗事百科,加入请求头
import requests
url = 'https://www.qiushibaike.com/'
headers = {
'user-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
res = requests.get(url, headers = headers)
print(res.text)
# 请求头查找:当前页面按F12,network里查找request header
## 异常处理,实例
try:
print(1/0)
except ZeroDivisionError:
print('程序出错')
2.6 re库的使用(数据的筛选)
# 导入库
import re
# (1)findall方法,用(.*?)替代爬取数据,根据两端相同内容,爬取括号内容
a = '哈哈罗攀哈哈'
name = re.findall('哈哈(.*?)哈哈',a)
print(name)
# 返回列表形式,括号内容
# (2)sub方法,替换内容
import re
a = '哈哈罗攀哈哈'
name = re.sub('哈哈(.*?)哈哈','小朱',a)
print(name)
# (3)re.S修饰符,类似(1),针对跨行匹配,为避免甄别是否换行,一般习惯性加上
import re
a = '哈哈罗攀哈哈'
name = re.findall('哈哈(.*?)哈哈',a,re.S)
print(name)
2.7 csv库的使用(数据的存储)
# 导入csv库
import csv
# 创建文件并打开
f = open('C:/Users/home/Desktop/1.csv','w+')
# 写入内容
writer = csv.writer(f)
writer.writerow(['name','text'])
2.8 循环语句的使用(跨页爬取数据,找规律,设模板)
urls = ['https://www.qiushibaike.com/text/page/{}/'.format(str(i)) for i in range(1,14)]
for url in urls:
print(url)
3 实战练习:用正则表达式爬取糗事百科文字信息(用户id,文字,好笑数,评论数)
3.1 爬虫思路
- 用requests库get请求爬取相关信息,加入请求头,防止被绊;
- 用re库对爬取的数据进行筛选(主要使用findall方法,并添加re.S修饰符);
- 爬取的数据进行csv存储。
- 为防止被绊,代码中加入time sleep(2),每爬取一次休息2s;
- 由于进行的是跨页筛选,url找规律并使用循环语句,爬取信息策略封装为1个小函数,进行循环爬取。、
3.2 爬虫步骤
# 导入需要使用的库
import requests
import re
import time
import csv
# ,获取数据以csv形式存储
f = open('C:/Users/home/Desktop/1.csv','w+',encoding='utf-8',newline='')
writer = csv.writer(f)
writer.writerow(['id','content','laugh','comment'])
# 加入请求头,利用requests请求,爬取数据
headers = {
'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
# 利用findall方法筛选所需数据,将该步骤封装为函数get_info
def get_info(url):
res = requests.get(url, headers=headers)
ids = re.findall('<h2>(.*?)</h2>',res.text,re.S)
contents = re.findall('<div class="content">.*?<span>(.*?)</span>.*?</div>',res.text,re.S)
laughs = re.findall('<span class="stats-vote"><i class="number">(.*?)</i> 好笑</span>',res.text,re.S)
comments = re.findall('<i class="number">(.*?)</i> 评论',res.text)
for id,content,laugh,comment in zip(ids,contents,laughs,comments):
writer.writerow([id.strip('\n'),content.strip('\n'),laugh,comment])
# 设循环语句,循环爬取数据,每次中断2s防止被绊
if __name__ == '__main__':
urls = ['https://www.qiushibaike.com/text/page/{}/'.format(str(i)) for i in range(1,14)]
for url in urls:
get_info(url)
time.sleep(2)
3.3 爬虫结果
糗事百科文字爬虫结果不知是爬虫中断还是其他原因,爬取的数据与老师给的结果相差较多,感觉只有部分内容,还需进一步练习发现存在的问题。
4 学习心得
- 按老师的流程下来可以大致看懂,并实际操作演练,但很多句型并不太明白其中含义,有些照葫芦画瓢的意思,这样子可能不能很好的举一反三,如何去突破这一困境?
- 爬虫代码写好了,如何知道爬虫运行结束?
Pcharm界面显示Process finished with exit code 0 - 获取的结果容易乱码,如何解决?
存储时,加入encoding = ‘utf-8’,newline = ‘’,可避免空行;csv格式文件用记事本打开,另存一次,编码选utf-8即可。 - 利用re库findall方法对数据进行筛选时,选择的长短都会影响结果,该环节得多练才能发现其中规律。
- 在Pcharm环境里写代码,有时候会不小心误删,撤销可使用快捷键Ctrl + Z。
- 在Pcharm环境里写代码,练习完的变成注释可使用快捷键“ctrl + /”,如何去注释呢?快捷键?