小白生信入门

【爬虫作业2】正则表达式爬虫

2018-08-13  本文已影响2人  猪猪头看世界

1. 学习任务:正则表达式爬虫

Day 3 观看第二讲视频,了解爬虫原理和requests库的使用
Day 4 观看第二讲视频,学会正则表达式爬虫,完成糗事百科爬虫

2. 学习笔记

2.1 网络连接

老师用“自动贩卖机”形象地介绍了网络连接的过程,即我们从电脑端向服务器发出请求(Request),获得回应(Response)的过程,而网络爬虫,其实也就是模拟了这样一个过程。


网络连接,图片来自于视频教程
2.2 爬虫原理

爬虫简单概括为:请求-筛选-存储,相关流程如下:


爬虫原理,图片来源于视频教程
2.3 Chrome浏览器安装和使用
2.4 Requests库的使用(数据的请求
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 爬虫思路
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 学习心得

上一篇下一篇

猜你喜欢

热点阅读