为了学习python爬虫,又来到了笔趣阁首页,准备爬取首页分类小说的数据,如图:
安装标准库lxml、requests、re和requests.exceptions、os、openpyxl
一共有六个小说类别,分别包裹在六个div标签中,上三个类别父标签相同,下三个类别父标签相同。 小说类别包裹在h2标签中,下面的每本小说又在li标签中(偷懒忽略了最上面的小说)。
首先第一个爬取页面的函数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表格,完成。 成果图:
import requests from requests.exceptions import RequestException from lxml import etree, html import re import os import openpyxl
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是懒惰模式,输出结果为:
学艺不精害人,要学好爬虫xpath还是得好好学,写正则表达式时候容易出错,学好xpath则会简单许多。 通过这个练习,学习了python操作Excel的一些简单方法,再接再厉,加油!
