前言:
1、什么是爬虫?也称为网页蜘蛛(Web Spider),通俗来说,解放人的双手, 去互联网获取数据, 以数据库, txt, excel, csv, pdf, 压缩文件, image, video, music保存数据。本质: 模拟浏览器, 向服务器发送网络请求, 接受服务器返回的数据,并保存数据。
2、爬虫的分类?A、通用爬虫(根据目标获取选项): 百度, google, 搜狗 bing ... 搜索引擎B、聚焦爬虫: 根据指定的目标,指定的内容,获取数据, 保存数据
3、网址的构成(了解)例如:https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=张三A、协议部分:https / http -- 超文本传输协议B、域名部分:www.baidu.com -- 【方便人记忆】C、路径部分:一层一层的信息D、参数部分:请求时候, 携带必要参数 -- &符号链接
4、爬虫四部曲:A、准备网址: B、请求网址: # 注意:请求成功 不一定 拿到数据C、解析数据: D、保存数据:
5、动态【异步】页面和静态【同步】页面 (数据加载方式) 静态页面----所需信息全部能找到 【同步请求】:发送请求后数据一次性返回过来,数据量小 动态页面---找不到或数据不全 【异步请求】:发送请求后数据没有一次性返回过来
源代码:
链接:https://www.gushiwen.cn/
import requests from lxml import etree class Two_Spider(object):def __init__(self):# self.keyword = input('请输入作者:')self.no = 1self.keyword = '白居易'self.start_url = 'https://so.gushiwen.cn/search.aspx?'self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'}def confirm_params(self):# 构造请求参数,保存3页for i in range(1, 4):params = {'type': 'author','page': str(i),'value': self.keyword,'valuej': self.keyword[0]}self.request_start_url(params)def request_start_url(self, params):response = requests.get(self.start_url, headers=self.headers, params=params).textself.parse_response(response)def parse_response(self, response):# 解析响应A = etree.HTML(response)div_list = A.xpath('//div[@class="left"]/div[@class="sons"]')for div in div_list:# 标题bt = div.xpath('.//div[@class="cont"]/div[2]/p/a/b/text()')bt = ''.join(bt).strip()# 正文zw = div.xpath('.//div[@class="contson"]//text()')# 简单处理正文zw = ''.join(zw).split('。')# for 行 in zw:# if '?' in 行:# 前面 = 行.split('?')[0] + '\n'# 后面 = 行.split('?')[1] + '\n'# zw_list.append(前面)# zw_list.append(后面)# elif ')' in 行:# 前面 = 行.split(')')[0] + ')'# 后面 = 行.split(')')[1]# zw_list.append(前面)# zw_list.append(后面)# else:# zw_list.append(行)# zw_list = [i.strip() for i in zw_list]# zw_list = '\n'.join(zw_list)self.save_Data(bt, zw)def save_Data(self, bt, zw):# 保存数据with open(f'{self.keyword}.txt', 'a+', encoding='utf-8') as f:f.write(f'【第{self.no}首】' + '\n')f.write(f'{bt}' + '\n')f.write(f'{self.keyword}' + '\n')f.write(f'{zw}' + '\n')f.write('\n')f.write('---------------' * 15)f.write('\n')print('ok---第{}首:{}'.format(self.no, bt))self.no += 1def main(self):self.confirm_params()if __name__ == '__main__':tw = Two_Spider()tw.main()