爬虫的自我学习与心得
前言
提示:爬虫可以分为:
聚焦爬虫,通用爬虫,增量爬虫
提示:以下是本篇文章正文内容,下面案例可供参考
一、通用爬虫
(1)通用爬虫基本知识
1.在向服务器响应以后选择json或者text后缀将返回的结果存储
存储:
爬取图片创建文件夹
if not os.path.exsist(‘kk’): os.mkdir(‘kk’)
kk_path=kk+img_name
With open(‘kk_path’,’w’,encoding=’utf-8’) as fp:fp.write()
创建文件:
Fp=open(‘filename.html’,’w’,encoding=’utf-8’) fp.write()
2.对页面进行判断,跟据其返回数值是否是ajex来调用json库
3.请求的时候需要判断是否需要参数传递从而来决定是否使用字典以及请求方式get。Post
(2)、通用爬虫和聚焦爬虫的区别
区别其实就是数据分析,当需要爬取的内容在另一个详情页面,并且在该页面通过参数控制进行跳转到另一个详情页面,往往需要数据分析
通用爬虫有时可使用这种方法:创建两个列表,一个存储详情的地址,一个存储详情数据
id_list=[]#id存储详情数据的地址的控制参数
all_data_list=[]#详情数据存储
for page in range(1,6):
page=str(page)
data={
'on':'true',
'page':'page',
'pagesize':'',
}#通过遍历爬取六页内容
json_ids=requests.post(url=url,headers=headers,data=data).json() 返回json数据包
for dic in json_ids['list']:#通过遍历,让dic获得json数据包返回的list列表中的值
id_list.append(dic['ID'])#每次遍历,将dic中的ID值存储至id_list列表中
post_url='sdfasdsfdadfa'#详情页面的url
for id in id_list:#遍历id_list列表取出id值
data={
'id':id
}#让id封装,id是详情页面的控制参数
detail_json=requests.post(url=post_url,data=data,headers=headers).json()请求的是详情页面的数据
all_data_list.append(detail_json)#将爬取道德的内容添加至all-date_list列表中
#存储
fp=open('./ll.json','w',encoding='utf-8')
json.dump(all_data_list,fp=fp,ensure_ascii=Flase)
二、聚焦爬虫
(1)bs4
Bs4数据解析原理:
实例化一个beautifulsoup对象,并将页面源码加载到该对象中
调用对象中相关属性或方法进行标签定位和数据提取
Bs4 lxml
导包:
from bs4 improt BeautifulSoulp
将本地的html文档加载到该对象中
Fp=open(‘./test.html’,’r’,encoding=utf-8)
BeautifulSoup(fp,’lxml’)
将互联网上获取的数据加载到对象中
Page_text=response.text
Soup=BeautifulSoup(page_text,’;lxml’)
提供的用于数据解析的方法和属性:
Soup.标签名----就能输出html中第一个出现的标签内容
Soup.find(标签名) 1查找第一次出现的标签 2属性定位suop.find(‘div’,class=’song’)—定位class为song的div标签
Soup.find_all(‘a’)返回所有a标签
Soup.select(‘某种选择其’) soup.select(‘.tang’)返回所有的满足tang的标签
Soup.select(‘。tang>ul>li>a’)[0]层次选择器找到唐的最外层然后通过选择找到第一个a标签 >层级分割器 >表示一个层级,空格多个层级
获取标签内容
Soup.a.text/string/get_text()
Text,get_text()获取一个标签内所有文本内容
String获取直系内容
获取属性值
Href属性值 soup.a[‘href’]
(2)xpath
Xpath和bas4类似,个人感觉更好用,比较灵活
调用etree对象 from lxml import etree
实例化:
Etree.parse()本地
Etree.HTML()网络
Eg.
9999009
11
22
Xpath最主要的就是获取内容以后它是以对象形式存在的,然后我们需要通过列表将其输出,咋存储的时候如果没有进行逐步获取,存储将会异常,会提示列表形式不能以字符串存储
自己写的一个爬取小说的:
import requests
from lxml import etree
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56'
}
url='https://www.17k.com/list/3241619.html'
response=requests.get(url=url,headers=headers)
response.encoding='utf-8'
page=response.text #防止其变成中文乱码
#将对象封存
tree=etree.HTML(page)
#数据分析定位标签
li_list=tree.xpath('//div[@class="Main List"]/dl/dd/a')
#打开文件
fp=open('xpath遍历小说.txt','w',encoding='utf-8')
#遍历li-list中的数据
for li in li_list:
title=li.xpath('./span/text()')[0]
fp.write(title+'\n')
#跳转小说页面爬取
data_src = 'https://www.17k.com/' + li.xpath('./@href')[0]
wenzhang=requests.get(url=data_src,headers=headers)
wenzhang.encoding='utf-8'
wenzhang2=wenzhang.text
#封存
data=etree.HTML(wenzhang2)
neirong_list=data.xpath('//div[@class="p"]/p')#切记,返回的形式是列表,必须将其中内容取出来然后形成字符串才能存取
for neirong in neirong_list:
xiaoshuo=neirong.xpath('./text()')#xpath爬取以后返回的内容是列表形式,由于所有p标签中均存在内容,需要将所有内容遍历出来
for xiaoshuo2 in xiaoshuo:
fp.write(xiaoshuo2)
fp.write('\n')
print(title,"打印完成")
总结
以上纯属个人认知,还望大佬们指出错误