什么是爬虫?
网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
现在让我们来实际操作一下,以爬取潇湘书院侧栏数据为例。
一、打开网页,审查需要爬取的数据的元素
找到对应的html语句<ul class="text-list">
二、向网页发送请求
通过requests向网页发送请求获取html文件,并通过BeautifulSoup库解析文件。
#请求网址对应内容 def request_list(url): html=requests.get(url) doc=BeautifulSoup(html.text) return doc;
三、解析文件提取需要的数据
获得网页的html文件后,通过find(),findAll()方法,找到需要的数据的位置,并将数据存进字典内。
根据步骤一获取到的相应html语句<ul class="text-list">,得到find()方法属性值'ul',{‘class’:'text-list'}
再根据ul标签下li标签内容,可知span标签内容为分类,a标签内容为小说名;通过遍历li标签,得到侧栏所有小说名及其分类,将数据存入字典中。
小提示:在几个获取数据的代码后添加print()方法可随时得知是否成功获取需要的数据。
#解析页面内容,将数据写入字典中 def parse_html(doc): lis=doc.find('ul',{'class':'text-list'}).findAll('li') print(lis) for x in lis: Title=x.find('a').text Class=x.find('span').text data={ 'Title':Title, 'Class':Class } #save_to_csv(data,'xxsy') print(data) #return data pass
运行后可得到如下数据:
与网页侧边栏比对,确定数据全部爬取下来,进行下一步。
四、将得到的数据存入CSV文件中
#将字典中的数据逐行写入CSV文件中 def save_to_csv(dict,filename): file_name='{}.csv'.format(filename) with open(file_name,'a+',encoding='utf-8') as f: file_exists=os.path.isfile(filename) w=csv.DictWriter(f, dict.keys(),delimiter=',', quotechar=' ', lineterminator=' ',quoting=csv.QUOTE_ALL, skipinitialspace=True) w.writerow(dict) #print('写入数据成功!') pass
这里需要注意csv.DictEriter()方法中的quotechar属性值不能为空;CSV文件打开方式为追加方式,以确保遍历li标签获取数据存入文件中时,不会将文件中已有的数据覆盖。
五、编写主函数,运行整个程序爬取数据
编写完各功能函数后,完成最后的主函数
if __name__=='__main__': url='https://www.xxsy.net/' doc=request_list(url) parse_html(doc) print('写入数据成功!')
整个程序代码如下
import requests from bs4 import BeautifulSoup import os.path import csv #请求网址对应内容 def request_list(url): html=requests.get(url) doc=BeautifulSoup(html.text) return doc; #解析页面内容,将数据写入字典中 def parse_html(doc): lis=doc.find('ul',{'class':'text-list'}).findAll('li') #print(lis) for x in lis: Title=x.find('a').text Class=x.find('span').text data={ 'Title':Title, 'Class':Class } save_to_csv(data,'xxsy') #print(data) #return data pass #将字典中的数据逐行写入CSV文件中 def save_to_csv(dict,filename): file_name='{}.csv'.format(filename) with open(file_name,'a+',encoding='utf-8') as f: file_exists=os.path.isfile(filename) w=csv.DictWriter(f, dict.keys(),delimiter=',', quotechar=' ', lineterminator=' ',quoting=csv.QUOTE_ALL, skipinitialspace=True) w.writerow(dict) #print('写入数据成功!') pass if __name__=='__main__': url='https://www.xxsy.net/' doc=request_list(url) parse_html(doc) print('写入数据成功!')
运行结果如下
打开存放python文件的文件夹,在该目录下系统自动新建了一个CSV文件xxsy.csv,与我们想要建立的文件文件名一致。
打开CSV文件xxsy.csv
可以看到我们需要的数据已经存进该文件中,爬取潇湘书院侧边栏数据成功!
有兴趣的同学也动手试试吧!