近来一段时间无聊,突然被古诗词吸引,之后就有了后续的一系列操作
作为计算机专业,对于批量获取内容肯定首选🕷(仅供个人学习)
首先要有个目标,去哪个网站获取数据,这里就选择了页面简化的唐诗宋词.这里选择里面的宋词分支就好了
通过调用F12控制台会发现所有的词信息都在ul
标签下的li
标签中这样就很方便了,直接通过定位获取然后循环遍历即可
res = requests.get(url, headers=headers)
res.encoding = res.apparent_encoding
if res.status_code == 200:html = parsel.Selector(res.text)url_list = html.xpath('/html/body/div[3]/main/div[2]/div/div/ul/li')
正常对网站发起请求并将判断返回代码是否为200,如果是则创建一个新的Selector
对象
查看文档结构树,标题结构为div->h3->a
中的内容即为要获取的词名
词的内容结构为div->div->p
即使词的所有信息,但是文档中是使用多个p
标签进行换行处理,所以后续获取的内容会进一步处理
text_title = url.xpath('./div/h3/a/text()').get()
text_content = url.xpath('./div/div/p/text()').getall()
get()
获取单个属性
getall()
根据匹配获取所有属性
由于最开始的词名是包括作者在其中的,所以可以根据》
进行切割分开词名和作者
Ancient_Poetry = text_title.split('》')
word_name = Ancient_Poetry[0] #词名
author = Ancient_Poetry[1] #作者
之后就是对词的内容进行一些符号替换即可
宋词页面是有3个分页的
#首页链接
https://www.tangshisongci.net/songcisanbaishou/
#第二页
https://www.tangshisongci.net/songcisanbaishou_2.html
#第三页
https://www.tangshisongci.net/songcisanbaishou_3.html
除了首页意外后面基本都是替换掉其中的数字即可,这样只需要使用一个循环就能生成链接
for i in range(1, 4):if i == 1:url = 'https://www.tangshisongci.net/songcisanbaishou/'else:url = f'https://www.tangshisongci.net/songcisanbaishou_{i}.html'
至此整个获取流程结束
import requests,parsel
from DataRecorder import Recorderrecorder = Recorder('data.csv')def get_html(url):headers = {"User-Agent": '',}res = requests.get(url, headers=headers)res.encoding = res.apparent_encodingif res.status_code == 200:html = parsel.Selector(res.text)url_list = html.xpath('/html/body/div[3]/main/div[2]/div/div/ul/li')for url in url_list:text_title = url.xpath('./div/h3/a/text()').get()text_content = url.xpath('./div/div/p/text()').getall()Ancient_Poetry = text_title.split('》')word_name = Ancient_Poetry[0]author = Ancient_Poetry[1]content = str(text_content).replace('[','').replace(']','').replace('\'','').replace('。,','。').replace(' ','').replace('!,','!')recorder.add_data((str(word_name + "》"), author, content))for i in range(1, 4):if i == 1:url = 'https://www.tangshisongci.net/songcisanbaishou/'else:url = f'https://www.tangshisongci.net/songcisanbaishou_{i}.html'get_html(url)
recorder.record()