Python爬虫(学习笔记)
通过etree-xpath获取二手房源标题
from lxml import etree import requests #指定URL url=’https://nc.58.com/ershoufang/’ #UA伪装 headers={‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0′} #获取整页文本 page_text=requests.get(url=url,headers=headers).text #初始化etree对象 tree=etree.HTML(page_text) #第一次解析,获取对象列表 div_list=tree.xpath(‘//section[@class=”list”]/div’) #打开文件 fp=open(‘./58.txt’,’w’,encoding=’utf-8′) #遍历对象列表 for div in div_list: #第二次解析,获取二手房源标题 title=div.xpath(‘./a/div/div/div/h3/text()’)[0] #数据持久化,写入本地文件 fp.write(title+’\n’) #print(title)
|
导入包 指定URL ua伪装 获取页面文本 初始化etree对象 通过xpath表达式 解析获取指定内容 数据持久化存储 |
解析方式总结
名称 |
正则表达式 |
BeautifulSoup |
xpath |
安装 |
— |
pip install bs4 pip install lxml |
pip install xpath pip install lxml |
导入包 |
import re import requests |
from bs4 import BeautifulSoup import requests |
from lxml import etree import requests |
原理 |
获取整页文本 指定re表达式 通过re方法匹配 获取指定内容 持久化数据存储 |
实例化soup对象 将页面文本载入soup对象 soup解析获取指定内容 持久化存储数据 |
1实例化一个etree对象,将需要解析的对象加载到该对象中 2调用etree中的xpaht方法,结合xpath表达式,实现标签定位和内容捕获 |
初始化 |
re.findall(ex,text,re.S) |
本地数据初始化 soup=BeautifulSoup(fp,’lxml’) 网页文本初始化 soup=BeautifulSoup(page_text,’lxml’) |
将本地文档源码加载到etree对象中 etree.parse(filePath) 将互联网的源码数据加载到etree对象中 etree.HTML(page_text) |
方法 |
requests.get(url,headers) requests.post(url,param,headers) response.text文本 response.json response.content二进制 |
soup.a/div/p/title/text/string text返回该标签下所有文本内容(各级子标签) string只返回本标签下的文本内容 例子:soup.title.parent.name 例子:soup.div.div.div.a.text soup.find(‘tagName’),soup.find_all() soup.find(‘tagName’,class_=’属性名’) soup.select(‘.bookcont > ul > span > a’) selecet多级访问,返回所有匹配项 .bookcont表示属性名ul表示标签名 find_all()方法没有找到目标是返回空列表,find()方法找不到目标时,返回None 通过CSS的类名查找:soup.select(“.sister”) 通过tag标签逐层查找:(可跨级) soup.select(“body a”) 找到某个tag标签下的直接子标签: soup.select(“head > title”)(不可跨级) soup.a[‘href’] |
xpath(‘xpath表达式’) ./表示当前目录 /(最左侧)表示根目录 /(不在最左侧)表示一个层级,相当于bs4的> //(最左侧)表示多个层级相当于bs4的空格 //(不在最左侧)表示从任意层级开始定位 属性定位://tag[@attrName=’attrVal’] 索引定位:索引下标从1开始而不是从0开始,tag[@attrName=’attrVal’]/p[3] ‘//div[@class=’tang’]//li[5]/a/text()’[0] /text()本层级内容 //text()所有层级内容 /@attrName取属性值 |
其他 |
中文文档 |
中文文档 https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#find |
中文文档 |
通过bs4解析三国
from bs4 import BeautifulSoup import lxml import requests url=’https://so.gushiwen.cn/guwen/book_46653FD803893E4F7F702BCF1F7CCE17.aspx’ headers={‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0′} page_text=requests.get(url=url,headers=headers).text soup=BeautifulSoup(page_text,’lxml’) #print(soup.div.div.div.a.text)#古诗文网 #print(soup.div.div.string)#None #print(soup.div.div.div.a[‘href’]) chapters=soup.select(‘.bookcont > ul > span > a’) print(chapters) with open(‘sanguo.txt’,’w’,encoding=’utf-8′) as fp: for a in chapters: title=a.string link=a[‘href’] page_content=requests.get(url=link,headers=headers).text soup2=BeautifulSoup(page_content,’lxml’) content=soup2.find(‘div’,class_=’contson’) content_text=content.text fp.write(title+’:\n’+content_text+’\n’) print(title ,’ 写入成功!!!’)
|
导入 指定URL UA伪装
读取起始页
创建soup对象,解析标题和内容URL 读取章节内容
创建soup2,解析章节内容 数据持久化,写入本地TXT文件 |
正则解析–爬取网页中的美女图片
import os.path import requests import re #导入包 #UA伪装 headers={‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0′} #存储图片的文件夹 folder=’./meinv/’ if not os.path.exists(folder): os.mkdir(folder) #指定URL url=’https://m.woyaogexing.com/tupian/z/meinv/’ #解析正则表达式 ex='” data-src=”(.*?)” />’ #src=”//img.woyaogexing.com/images/grey.gif” data-src=”//img2.woyaogexing.com/2022/07/03/ecb599c9ffa42f2f!400×400.jpg” /> #解析获取图片url列表 text=requests.get(url=url,headers=headers).text image_list=re.findall(ex,text,re.S)
print(image_list) #遍历图片URL for src in image_list: src=’https:’+src #生成完整路径 img_data=requests.get(url=src,headers=headers).content #读取图片的二进制数据content name=src.split(‘/’)[-1] #从路径获取图片名称 path=folder+name #写入文件路径 with open(path,’wb’) as fp:#打开文件 fp.write(img_data) #写入数据 print(name,’保存成功’)#打印日志 |
n 导入包 n UA伪装 n 创建文件夹存储图片
n 指定URL n 读取页面所有内容
n 根据页面格式,编制正则表达式 n 通过正则表达式,解析页面内容获取图片url
n 遍历所有图片url n 读取图片二进制数据
n 图片数据持久化存储 |
聚焦爬虫,爬取页面中指定的页面内容,例如豆瓣中评分>9的电影;
数据解析:从整个页面中获取所需的部分信息;
数据解析分类:
- 正则
- bs4-beautiful Soup
- xpath-通用性强
数据解析原理:
解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储;
1 进行指定标签的定位
2 标签或者标签对应的属性中存储的数据值进行提取(解析)
爬取肯德基餐厅数据
import json#导入包 import requests #指定URL url=’http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword’ add=’南昌’#指定参数 params={ ‘cname’: ”, ‘pid’: ”, ‘keyword’: add, ‘pageIndex’: 1, ‘pageSize’: 10, }#UA伪装 headers={‘User-Agent’:’Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0′} #发起请求 response=requests.post(url=url,headers=headers,params=params) json_obj=response.json()#获取数据 print(json_obj) with open(‘kfc_’+add+’.json’,’w’) as fp: json.dump(json_obj,fp=fp) #数据持久化保存 print(‘成功保存’) |
requests爬虫流程
1导入包
2 指定url(通过F12调试查看)
3指定参数(通过F12调试查看)
4指定UA(UA伪装)
5发起请求get/post
6获取数据
7数据持久化保存 |
原文地址:http://www.cnblogs.com/zhangdezhang/p/16799448.html