美文网首页小白生信入门
【爬虫作业2】正则表达式爬虫

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

作者: 猪猪头看世界 | 来源:发表于2018-08-13 03:17 被阅读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 + /”,如何去注释呢?快捷键?

相关文章

网友评论

    本文标题:【爬虫作业2】正则表达式爬虫

    本文链接:https://www.haomeiwen.com/subject/cswjbftx.html