python爬虫爬取奇书阁首页分类小说数据
为了学习python爬虫,又来到了奇书阁首页,准备爬取首页分类小说的数据,如图:
0X00、准备工作
安装标准库lxml、requests、re和requests.exceptions、os、openpyxl
0X01、页面分析
一共有六个小说类别,分别包裹在六个div标签中,上三个类别父标签相同,下三个类别父标签相同。
小说类别包裹在h2标签中,下面的每本小说又在li标签中(偷懒忽略了最上面的小说)。
0X02、代码实现
首先第一个爬取页面的函数get_page,传入参数url,请求该页面,如果返回状态码200,证明请求成功,则函数返回响应内容,否则返回None。
def get_page(url):
try:
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
else:
return None
except RequestException:
return None
之后是第二个函数parse_page,对得到的响应的内容进行解析,并将其存入Excel表格中。
def parse_page(text):
# 打开文件
if os.path.exists('biquge.xlsx'):
print('文件biquge.xlsx已存在!')
wb = openpyxl.load_workbook('biquge.xlsx')
print('文件biquge.xlsx打开成功!')
else:
wb = openpyxl.Workbook() # 创建文件对象
print('文件创建成功!')
order = 2
# 获取第一个sheet
ws = wb.active
ws['A1'] = '小说类别'
ws['B1'] = '书名'
ws['C1'] = '作者'
ws['D1'] = '链接'
content = []
html_xpath = etree.HTML(text)
for i in range(0, 3):
content_1 = html_xpath.xpath('//*[@id="main"]/div[3]/div[' + str(i + 1) + ']')
a = html.tostring(content_1[0], encoding='utf-8').decode('utf-8')
content.append(a)
for i in range(0, 3):
content_2 = html_xpath.xpath('//*[@id="main"]/div[4]/div[' + str(i + 1) + ']')
a = html.tostring(content_2[0], encoding='utf-8').decode('utf-8')
content.append(a)
for i in range(0, 6):
# 获取小说类别
title = re.findall('<h2>(.*)</h2>', content[i], flags=0)
# 获取书名
book = re.findall('<li><a.*?>(.*?)</a>', content[i], flags=0)
# 获取作者
author = re.findall('<li>.*?</a>/(.*?)</li>', content[i], flags=0)
# 获取链接
link = re.findall('<li><a href="(http://www.xbiquge.la/\\d+/\\d+/)?">', content[i], flags=0)
for n in range(len(book)):
text = [title[0], book[n], author[n], link[n]]
print('书籍 '+book[n]+' 写入成功')
for x in range(len(text)):
ws.cell(order, x + 1, text[x])
order += 1
wb.save(filename="biquge.xlsx")
首先判断文件biquge.xlsx是否已经存在,有则提示文件已存在,如果没有则创建文件后提示创建文件成功。
接着定义了一个变量order,表示下一次书籍信息存入的行数。第一行则填入了相应的书籍信息。
接下来就到了解析内容的时候了(xpath没学好吃了不少亏…),先后将上下三个类别的内容进行解析。(开始时候没有将得到的element对象进行转化,捣鼓了半天…)进行转化编码a = html.tostring(content_1[0], encoding='utf-8').decode('utf-8')
存入列表中。其实这里可以直接用xpath将内容提取出来,但是当时没怎么学xpath,就用了正则表达式,就当学习正则表达式了(害)。
在使用正则表达式进行数据提取的时候也忽略了他的匹配机制,默认的贪婪匹配,导致一直只提取出一条数据。在后面会说一下这个。
得到所有的数据后,将每条数据逐一填入Excel表格,完成。
成果图:
0X03、完整代码
import requests
from requests.exceptions import RequestException
from lxml import etree, html
import re
import os
import openpyxl
获取页面源码
def get_page(url):
try:
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
else:
return None
except RequestException:
return None
def parse_page(text):
# 打开文件
if os.path.exists('biquge.xlsx'):
print('文件biquge.xlsx已存在!')
wb = openpyxl.load_workbook('biquge.xlsx')
print('文件biquge.xlsx打开成功!')
else:
wb = openpyxl.Workbook() # 创建文件对象
print('文件创建成功!')
order = 2
# 获取第一个sheet
ws = wb.active
ws['A1'] = '小说类别'
ws['B1'] = '书名'
ws['C1'] = '作者'
ws['D1'] = '链接'
# print(text)
# content = re.findall('(<div class="content.*<ul>.*</ul>.*</div>)', html, flags=0)
content = []
html_xpath = etree.HTML(text)
for i in range(0, 3):
content_1 = html_xpath.xpath('//*[@id="main"]/div[3]/div[' + str(i + 1) + ']')
a = html.tostring(content_1[0], encoding='utf-8').decode('utf-8')
content.append(a)
for i in range(0, 3):
content_2 = html_xpath.xpath('//*[@id="main"]/div[4]/div[' + str(i + 1) + ']')
a = html.tostring(content_2[0], encoding='utf-8').decode('utf-8')
content.append(a)
for i in range(0, 6):
# 获取小说类别
title = re.findall('<h2>(.*)</h2>', content[i], flags=0)
# 获取书名
book = re.findall('<li><a.*?>(.*?)</a>', content[i], flags=0)
# 获取作者
author = re.findall('<li>.*?</a>/(.*?)</li>', content[i], flags=0)
# 获取链接
link = re.findall('<li><a href="(http://www.xbiquge.la/\\d+/\\d+/)?">', content[i], flags=0)
for n in range(len(book)):
text = [title[0], book[n], author[n], link[n]]
print('书籍 ' + book[n] + ' 写入成功')
for x in range(len(text)):
ws.cell(order, x + 1, text[x])
order += 1
wb.save(filename="biquge.xlsx")
url = 'http://www.xbiquge.la/'
text = get_page(url)
if text is not None:
parse_page(text)
0X04、正则表达式
1、贪婪匹配和懒惰匹配 影响的是正则表达式的限定符的匹配结果;
在限定符后面加上?,则为懒惰模式;会匹配最长的以开始位置开始,以结束位置结束的字符串;
在限定符后面不加?,则为贪婪模式;匹配尽可能少的字符。
2、举例
下面这段代码:
import re
string = 'abcsasfjkc'
a = re.search('a.*c', string)
b = re.search('a.*?c', string)
print(a.group())
print(b.group())
对于字符串abcsasfjkc,a采取的正则表达式是’a.*c’,而b是’a.*?c’。则a采取的是贪婪模式,而b是懒惰模式,输出结果为:
0X05、反思
学艺不精害人,要学好爬虫xpath还是得好好学,写正则表达式时候容易出错,学好xpath则会简单许多。
通过这个练习,学习了python操作Excel的一些简单方法,再接再厉,加油!
本文地址:https://blog.csdn.net/qq_45653588/article/details/107130127
上一篇: 浅析用户登录注册的页面应该如何设计