python爬虫解析页面数据的三种方式
re模块
- re.S表示匹配单行
- re.M表示匹配多行
使用re模块提取图片url,下载所有糗事百科中的图片
普通版
import requests
import re
import os
if not os.path.exists('image'):
os.mkdir('image')
def get_page(number):
'''
页数
:param number:
:return:
'''
if number == 1:
url = 'https://www.qiushibaike.com/pic/'
else:
url='https://www.qiushibaike.com/pic/'+str(number)
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
page_text = requests.get(url=url,headers=headers).text
img_list = re.findall('<div class="thumb">.*?<img src="(.*?)".*?>.*?</div>',page_text,re.S)
for _url in img_list:
img_url = 'https:'+_url
response = requests.get(url=img_url,headers=headers)
filename = img_url.split('/')[-1]
file_path = 'image/%s'%filename
with open(file_path,'wb') as f:
f.write(response.content)
print('爬取第%s页数据中:%s'%(number,filename))
for i in range(1,35):
get_page(i)
使用多线程下载
import requests
import re
import os
from concurrent.futures import ThreadPoolExecutor
if not os.path.exists('image'):
os.mkdir('image')
def get_page(number):
'''
页数
:param number:
:return:
'''
if number == 1:
url = 'https://www.qiushibaike.com/pic/'
else:
url='https://www.qiushibaike.com/pic/'+'page/'+str(number)
print(url)
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
page_text = requests.get(url=url,headers=headers).text
img_list = re.findall('<div class="thumb">.*?<img src="(.*?)".*?>.*?</div>',page_text,re.S)
for _url in img_list:
img_url = 'https:'+_url
response = requests.get(url=img_url,headers=headers)
filename = img_url.split('/')[-1]
file_path = 'image/%s'%filename
with open(file_path,'wb') as f:
f.write(response.content)
print('爬取第%s页数据中:%s'%(number,filename))
if __name__ == '__main__':
pool = ThreadPoolExecutor(5)
for i in range(1,36):
pool.submit(get_page,i)
pool.shutdown()
print('爬取完毕')
xpath
xpath在爬虫中的使用流程
- 下载
- 导包
- 创建etree对象进行指定数据的解析
- 本地:tree = etree.parse('本地文件路径')
- etree.xpath('xpath表达式')
- 网络:tree = etree.HTML('网络请求到的页面数据')
- tree.xpath('xpath表达式')
- 本地:tree = etree.parse('本地文件路径')
#安装
pip3 install lxml
#导包
from lxml import etree
常用的xpath表达式
属性定位:
#找到class属性值为song的div标签
//div[@class="song"]
层级&索引定位:
#找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
//div[@class="tang"]/ul/li[2]/a
逻辑运算:
#找到href属性值为空且class属性值为du的a标签
//a[@href="" and @class="du"]
模糊匹配:
//div[contains(@class, "ng")] # 包含
//div[starts-with(@class, "ta")] #以什么开头的
取文本:
# /表示获取某个标签下的文本内容
# //表示获取某个标签下的文本内容和所有子标签下的文本内容
//div[@class="song"]/p[1]/text() # 只能获取当前标签下面直系存储的文本数据
//div[@class="tang"]//text() # 获取某一个标签下,所有子标签中存储的文本数据
取属性:
//div[@class="tang"]//li[2]/a/@href
xpath简单使用
from lxml import etree
import requests
url = 'https://www.qiushibaike.com/pic/'
page_text = requests.get(url=url).text
tree = etree.HTML(page_text)
url_list = tree.xpath('//div[@class="article block untagged mb15"]/div[2]/a/img/@src')
print(url_list)
xpath插件
- xpath插件:就是可以直接将xpath表达式作用域浏览器的网页中
- 安装:chorm浏览器 -> 更多工具 -> 扩展程序 -> 开启开发者模式 -> 将xpath插件拖动到页面
- 快捷键
- 开启关闭:ctrl + shift + x
Element类型的对象可以继续调用xpath函数,对该对象表示的局部内容进行指定内容解析
# 使用xpath提取出段子网的段子和标题
import requests
from lxml import etree
url = 'https://ishuo.cn/'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
page_text = requests.get(url=url,headers=headers).text
tree = etree.HTML(page_text)
li_list = tree.xpath('//div[@id="list"]/ul/li')
f = open('段子.text','w',encoding='utf-8')
for li in li_list:
content = li.xpath('./div[@class="content"]/text()')[0]
title = li.xpath('./div[@class="info"]/a/text()')[0]
f.write("#####################\n"+title+":\n"+content+"\n\n")
print('写入数据成功')
BeautifulSoup解析
BeautifulSoup库是python独有的库,简单便捷和高效
核心思想:将将html文档转换成Beautiful对象,然后调用该对象中的属性和方法进行html文档指定内容的定位查找。
导包
from bs4 import BeautifulSoup
- 创建BeautifulSoup对象:
- 如果html文档的来源是来源于本地:Beautiful('open('本地的html文件')','lxml')
- 如果html是来源于网络:Beautiful(‘网络请求到的页面数据’,‘lxml’)
属性和方法
- 根据标签名查找:
soup.a # 只能找到第一个符合要求的标签
- 获取属性
soup.a.attrs # 获取a所有的属性和属性值,返回一个字典
soup.a.attrs['href'] # 获取href属性
soup.a['href'] # 也可简写为这种形式
- 获取内容
soup.a.string //text()
soup.a.text //text()
soup.a.get_text() //text()
# 如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容
- find:找到第一个符合要求的标签
soup.find('a') //找到第一个符合要求的
soup.find('a', title="xxx")
soup.find('a', alt="xxx")
soup.find('a', class_="xxx")
soup.find('a', id="xxx")
- find_All:找到所有符合要求的标签
soup.find_All('a')
soup.find_All(['a','b']) # 找到所有的a和b标签
soup.find_All('a', limit=2) # 限制前两个
- 根据选择器选择指定的内容
select:soup.select('#feng')
常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器
select选择器返回永远是列表,需要通过下标提取指定的对象
使用BeautifulSoup解析爬取三国演义小说全集
import requests
from bs4 import BeautifulSoup
url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
page_text = requests.get(url=url,headers=headers).text
def get_content(url,fileobj):
'''
爬取页面内容
:param url:
:param fileobj:
:return:
'''
content_page = requests.get(url=url, headers=headers).text
content_soup = BeautifulSoup(content_page, 'lxml')
p_list = content_soup.select('.chapter_content > p')
for p in p_list:
fileobj.write('\n' + p.text + '\n\n')
soup = BeautifulSoup(page_text,'lxml')
a_list = soup.select('.book-mulu > ul > li > a')
f = open('三国演义.txt','w',encoding='utf-8')
for a in a_list:
f.write('\n'+a.text)
content_url = 'http://www.shicimingju.com'+a['href']
get_content(content_url,f)
print('爬取成功',a.text)
python爬虫解析页面数据的三种方式的更多相关文章
- python爬虫-提取网页数据的三种武器
常用的提取网页数据的工具有三种xpath.css选择器.正则表达式 1.xpath 1.1在python中使用xpath必须要下载lxml模块: lxml官方文档 :https://lxml.de/i ...
- python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)
一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...
- Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式
Linux就这个范儿 第15章 七种武器 linux 同步IO: sync.fsync与fdatasync Linux中的内存大页面huge page/large page David Cut ...
- 命令行运行Python脚本时传入参数的三种方式
原文链接:命令行运行Python脚本时传入参数的三种方式(原文的几处错误在此已纠正) 如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. pyth ...
- ajax数据提交数据的三种方式和jquery的事件委托
ajax数据提交数据的三种方式 1.只是字符串或数字 $.ajax({ url: 'http//www.baidu.com', type: 'GET/POST', data: {'k1':'v1'}, ...
- Struts2(四.注册时检查用户名是否存在及Action获取数据的三种方式)
一.功能 1.用户注册页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- 仿联想商城laravel实战---5、无刷新的增删改查(动态页面更新的三种方式(html))
仿联想商城laravel实战---5.无刷新的增删改查(动态页面更新的三种方式(html)) 一.总结 一句话总结: 直接js增加删除修改html 控制器直接返回处理好的页面 用双向绑定插件比如vue ...
- 解析Xml文件的三种方式及其特点
解析Xml文件的三种方式 1.Sax解析(simple api for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用 ...
- ios网络学习------4 UIWebView的加载本地数据的三种方式
ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...
随机推荐
- Docker Overlay 介绍
Overlay Network Overlay Network:属于Docker网络驱动,基于VXLAN封装实现Docker原生Overlay网络. Overlay Network:覆盖网络,在基础网 ...
- css的再深入8(更新中···)
1.去滚动条的属性 overflow:hidden; overflow-x:hidden; 水平超出的隐藏. 2.z-index 层次叠加 元素重叠 谁的值大谁在上面 (1) 父级出现position ...
- UVA1160 X-Plosives
思路 每个元素设为点,化合物设为边 不能出现k条边k个点的环 直接并查集检查即可 代码 #include <cstdio> #include <algorithm> #incl ...
- P4512 【模板】多项式除法
思路 多项式除法板子 多项式除法 给出\(A(x)\)和\(B(x)\),求一个\(n-m\)次的多项式\(D(x)\),一个\(m-1\)次多项式\(R(x)\),满足 \[ A(x)=B(x)D( ...
- LINQ之路14:LINQ Operators之排序和分组(Ordering and Grouping)
本篇继续LINQ Operators的介绍,这里要讨论的是LINQ中的排序和分组功能.LINQ的排序操作符有:OrderBy, OrderByDescending, ThenBy, 和ThenByDe ...
- Mac配置Scala和Spark最详细过程
Mac配置Scala和Spark最详细过程 原文链接: http://www.cnblogs.com/blog5277/p/8567337.html 原文作者: 博客园--曲高终和寡 一,准备工作 1 ...
- _map_char_stats
可以控制玩家进入地图后进行属性平衡. `comment` 备注 `map` 地图ID `vip`vip等级 `shengming`生命 `liliang` 力量 `minjie` 敏捷 `zhili` ...
- 树状DP HDU1520 Anniversary party
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:职员之间有上下级关系,每个职员有自己的happy值,越高在派对上就越能炒热气氛.但是必须是 ...
- 『Python CoolBook』C扩展库_其二_demo演示
点击进入项目 C函数源文件 /* sample.c */ #include "sample.h" /* Compute the greatest common divisor */ ...
- 『TensorFlow』SSD源码学习_其七:损失函数
Fork版本项目地址:SSD 一.损失函数介绍 SSD损失函数分为两个部分:对应搜索框的位置loss(loc)和类别置信度loss(conf).(搜索框指网络生成的网格) 详细的说明如下: i指代搜索 ...