前言:
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 = 1 self.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).text self.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 += 1 def main(self): self.confirm_params() if __name__ == '__main__': tw = Two_Spider() tw.main()