一.基本知识
1.delete from qsbk先删除数据库中的数据,在执行本文件
2.需要引入的包
import re
import time
from tool import Tools, DBManager
from urllib import request
from fake_useragent import UserAgent
agent = UserAgent()
3.当网页在第一页的时候,可以获取到下一页,但是当网页在最后一页的时候,无法获取到下一页
4.获取下一页
法一(获取下一页时候...位置一直在变化,所有无法用正则获取到下一页):
# 正则直接找不到下一页,先找到下一页的字符
index = self.html.find('class="next"')
# index如果找不到 返回-1
print(index)
# 如果没找到下一页
if index != -1:
# 截取下一页前后部分的字符串
s = self.html[index-90:index]
# print(s)
# 在使用正则从截取的字符串中进行匹配
pattern = re.compile('href="(.*?)"')
next_href = re.search(pattern, s)
page = next_href.group(1).split('/')[-2]
print('正在爬取第{}页'.format(page))
self.url = 'https://www.qiushibaike.com' + next_href.group(1)
self.get_html()
# 调用自身函数 解析数据
self.parse_data()
else:
print('没有下一页')
法二:(用正则获取下一页)
# next_pat = re.compile('<span class="next">(.*?)</span>',re.S)
# res = re.search(next_pat,self.html)
# if res:
# print('正在处理下一页数据.......')
# # 查找下一页的链接 正则
# next_pat = re.compile('<span class="dots".*?<a.*?<a.*?<a href="(.*?)".*?>.*?<span.*?>',re.S)
# res = re.search(next_pat,self.html)
# # 拼接完整的链接
# self.url = 'https://www.qiushibaike.com'+res.group(1)
# print(self.url)
# self.get_html()
# # 调用函数本身,解析数据
# self.parse_data()
#
# else:
# print('没有下一页了')
二.完整代码
# -*- coding:utf-8 -*-
import re
import time
from tool import Tools, DBManager
from urllib import request
from fake_useragent import UserAgent
agent = UserAgent()
class QSBKSpider(object):
def __init__(self):
self.url = 'https://www.qiushibaike.com/text/page/1'
self.headers = {'User-Agent': agent.random}
self.html = ''
def get_html(self):
count = 1
while True:
try:
req = request.Request(url=self.url, headers=self.headers)
response = request.urlopen(req)
self.html = response.read().decode('utf-8')
except Exception as e:
count += 1
if count > 10:
print('当前页数据获取失败!')
break
print('%s,正在尝试第%s次连接...' % (e, count))
else:
break
# 解析数据
def parse_data(self):
# 准备正则
pattern = re.compile('<div.*?class="author.*?<h2>(.*?)</h2>.*?<div class="articleGender.*?>(.*?)</div>.*?<div class="content.*?<span>(.*?)</span.*?<i class="number.*?>(.*?)</i.*?<i.*?>(.*?)</i>', re.S)
res = re.findall(pattern, self.html)
# print(res)
for info in res:
msg = list(info)
msg[0] = Tools.strip_char(info[0])
msg[2] = Tools.strip_char(info[2])
# print('用户昵称:{}\n年龄:{}\n内容:{}\n好笑数:{}\n评论数:{}\n'.format(name, info[1], content, info[3], info[4]))
DBManager.insert_data(msg)
# 正则直接找不到下一页,先找到下一页的字符
index = self.html.find('class="next"')
# index如果找不到 返回-1
print(index)
# 如果没找到下一页
if index != -1:
# 截取下一页前后部分的字符串
s = self.html[index-90:index]
# print(s)
# 在使用正则从截取的字符串中进行匹配
pattern = re.compile('href="(.*?)"')
next_href = re.search(pattern, s)
page = next_href.group(1).split('/')[-2]
print('正在爬取第{}页'.format(page))
self.url = 'https://www.qiushibaike.com' + next_href.group(1)
self.get_html()
# 调用自身函数 解析数据
self.parse_data()
else:
print('没有下一页')
# next_pat = re.compile('<span class="next">(.*?)</span>',re.S)
# res = re.search(next_pat,self.html)
# if res:
# print('正在处理下一页数据.......')
# # 查找下一页的链接 正则
# next_pat = re.compile('<span class="dots".*?<a.*?<a.*?<a href="(.*?)".*?>.*?<span.*?>',re.S)
# res = re.search(next_pat,self.html)
# # 拼接完整的链接
# self.url = 'https://www.qiushibaike.com'+res.group(1)
# print(self.url)
# self.get_html()
# # 调用函数本身,解析数据
# self.parse_data()
#
# else:
# print('没有下一页了')
def start(self):
self.get_html()
# print(self.html)
self.parse_data()
if __name__ == '__main__':
# 连接数据库
DBManager.connect_db()
# 爬虫
qsbk = QSBKSpider()
qsbk.start()
# 关闭数据库
DBManager.close_db()
# delete from qsbk
运行结果
打开数据库:获取到325条数据,但是数据库每页只显示20条数据