作为一个刚接触爬虫的小白,在学习了一定的语法后,第一个目标就是找一个适合初学者的网站来小试牛刀。一般来讲都会选择一个难度系数比较低的网站来进行爬取,这样不仅有助于我们快速掌握语法,同样也能够让我们收获爬取成功的小欢喜。

在此之前,我们可以选择内涵段子来进行练手,无论是教学演示还是小白练手都是一个不错的选择。但是后来内涵段子他死了,不是被人写爬虫爬死的,而是自己作死的,这就让我们损失了一个磨刀霍霍向猪羊的机会。那我们该怎么办呢,我们可以选择一些企业网站或是一个咨询类的网站进行练手。不过这些都是个人建议,仅供参考。

今天给大家演示的是爬取"百思不得姐"的爬虫代码。让我们在练手的同时,也能够轻松一刻。首先让我分析下网站内容。

打开网址:http://www.budejie.com/,这个是网站的首页内容,然后点击第二页,第三页,你可以发现爬取链接的规律。即第二页为:/2,第三页为:/3。如下图:


利用python爬取百思不得姐demo实例_键值对


接下来让我们审查元素,按F12进行元素审查,查找标签的规律,以方便我们接下来编写正则表达式来提取内容:

利用python爬取百思不得姐demo实例_键值对_02


查找到标签的规律后,接下来就让我们着手代码的编写工作。新建一个BuDeie.py文件。具体代码如下:

import requests
import re
import time
import io
import sys




class BudeJie(object):


def __init__(self, base_url, *args, **kwargs):
self.base_url = base_url
#设置请求头
self.headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"}
#re模块的正则
self.first_pattern = re.compile(r'<div class="j-r-list-c-desc">.*?</div>', re.S)
self.second_pattern = re.compile(r"<.*?>|&(.*?);|\s| ")


#发送请求
def send_request(self,url):
#停止一秒
time.sleep(1)
#发送请求
response = requests.get(url, headers=self.headers)
#转为utf-8格式
return response.content.decode('utf-8')


#写入数据
def write_file(self,data,page):
#with open(**) as f 常见的读写操作:
with open("budejie.txt","a",encoding='UTF-8') as f:
filename = "第" + str(page) + "页的段子\n"
print(filename)
f.write(filename)


for content in data:
#替换提取到的 a 标签
second_data = self.second_pattern.sub("",content)
#写入数据
f.write(second_data)
f.write("\n\n")


#解析数据
def analy_file(self, data):
#结合上文的 re.compile 使用
data_list = self.first_pattern.findall(data)
return data_list


#调度方法
def start_work(self):
for page in range(1,5):
#拼接url
url = self.base_url + str(page)
#发送请求
data = self.send_request(url)
second_data = self.analy_file(data)
self.write_file(second_data,page)


if __name__ == "__main__":
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
#实例化对象
B = BudeJie("http://www.budejie.com/")
B.start_work()


# import 为了调用定义在其他文件中的变量
# requests模块 第三方网络请求库
# re模块 正则表达式
# time模块 时间获取和转换
# io模块 读写文件
# sys 系统特定的参数和功能
# class BudeJie(object): 定义一个类库
# def __init__(self, base_url, *args, **kwargs):
# 定义类的时候,若是添加__init__方法,那么在创建类的实例的时候,实例会自动调用这个方法
# self 第一个参数永远是 self ,并且调用时不用传递该参数
# base_url 爬取的网址
# *args 来发一个非键值对的可变数量的参数列表给一个函数
# **kwargs 将一个不定长度的键值对,作为参数传递给一个函数

运行上述代码如图:

利用python爬取百思不得姐demo实例_正则表达式_03

即可运行成功。当然有的人可能会遇到如下这种情况:

利用python爬取百思不得姐demo实例_re模块_04

 是因为python中还没有安装requests库,我们通过cmd打开黑窗口:执行下面这行代码:

pip install requests

利用python爬取百思不得姐demo实例_re模块_05

当看到这个即表示安装成功,再次点击运行程序,可完美解决刚才存在的问题。

以上就是今天给大家分享的百思不得姐的爬取,只是爬取里面的文本,有兴趣的小伙伴可以扩展下思维,自行爬取下其他内容,谢谢大家。获取演示代码,请在公众号回复 ‘百思不得姐’ 。