【爬虫作业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 + /”,如何去注释呢?快捷键?
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 声明:本文讲解的实战内容,均仅用于学习交流,请勿用于任何商业用途! 一、前言 强烈建议:请在电脑的陪同下,阅读本文...
    Bruce_Szh阅读 12,704评论 6 28
  • 明月何皎皎 芳草何茫茫 雁飞连三月 寄我长相思
    六辩阅读 166评论 0 0
  • 今天早上起来一睁眼,就收到了同学丶朋友们的立冬祝福。整整一天,朋友圈刷屏各式各样的饺子,各式各样的调侃和祝福,很充...
    淡淡的滋味阅读 174评论 0 0
  • 我们要的飞翔, 却是有些人割舍不掉的心伤, 放不放手的纠结彷徨, 飞不飞翔的犹豫想象。
    BULABULA小八阅读 186评论 0 1
  • 1.创建一个XMLHttpRequest的对象.2.通过open与服务器建立连接。3.使用send来发送请求。4....
    转身后仰C阅读 522评论 0 0