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表达式')
#安装
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’)

属性和方法

  1. 根据标签名查找:
soup.a  # 只能找到第一个符合要求的标签
  1. 获取属性
soup.a.attrs  # 获取a所有的属性和属性值,返回一个字典
soup.a.attrs['href'] # 获取href属性
soup.a['href'] # 也可简写为这种形式
  1. 获取内容
soup.a.string   //text()
soup.a.text //text()
soup.a.get_text() //text()
# 如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容
  1. find:找到第一个符合要求的标签
soup.find('a') //找到第一个符合要求的
soup.find('a', title="xxx")
soup.find('a', alt="xxx")
soup.find('a', class_="xxx")
soup.find('a', id="xxx")
  1. find_All:找到所有符合要求的标签
soup.find_All('a')
soup.find_All(['a','b']) # 找到所有的a和b标签
soup.find_All('a', limit=2) # 限制前两个
  1. 根据选择器选择指定的内容
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爬虫解析页面数据的三种方式的更多相关文章

  1. python爬虫-提取网页数据的三种武器

    常用的提取网页数据的工具有三种xpath.css选择器.正则表达式 1.xpath 1.1在python中使用xpath必须要下载lxml模块: lxml官方文档 :https://lxml.de/i ...

  2. python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)

    一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...

  3. 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 ...

  4. 命令行运行Python脚本时传入参数的三种方式

    原文链接:命令行运行Python脚本时传入参数的三种方式(原文的几处错误在此已纠正) 如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. pyth ...

  5. ajax数据提交数据的三种方式和jquery的事件委托

    ajax数据提交数据的三种方式 1.只是字符串或数字 $.ajax({ url: 'http//www.baidu.com', type: 'GET/POST', data: {'k1':'v1'}, ...

  6. Struts2(四.注册时检查用户名是否存在及Action获取数据的三种方式)

    一.功能 1.用户注册页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  7. 仿联想商城laravel实战---5、无刷新的增删改查(动态页面更新的三种方式(html))

    仿联想商城laravel实战---5.无刷新的增删改查(动态页面更新的三种方式(html)) 一.总结 一句话总结: 直接js增加删除修改html 控制器直接返回处理好的页面 用双向绑定插件比如vue ...

  8. 解析Xml文件的三种方式及其特点

    解析Xml文件的三种方式 1.Sax解析(simple api  for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用 ...

  9. ios网络学习------4 UIWebView的加载本地数据的三种方式

    ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...

随机推荐

  1. oracle insert、append、parallel、随后查询的redo与磁盘读写

    SQL> set autotrace traceonly statistics; SQL> insert into big_table_dir_test1 select * from bi ...

  2. 搭建Elasticsearch平台

    https://cloud.tencent.com/developer/article/1189282 https://blog.csdn.net/qq_34021712/article/detail ...

  3. 【论文笔记】Dynamic Routing Between Capsules

    Dynamic Routing Between Capsules 2018-09-16 20:18:30 Paper:https://arxiv.org/pdf/1710.09829.pdf%20 P ...

  4. 一些有趣的 js 包

    https://github.com/octalmage/robotjs Node.js桌面自动化.控制鼠标,键盘和屏幕. http://robotjs.io

  5. 关于MVC RouteExistingFiles疑问后续

    前两天写了<关于MVC RouteExistingFiles疑问>,本来希望寻求大佬快速解答,奈何无人问津. 只能查看.NET 源代码,可以使用反编译工具(我用IL spy),也可以在线查 ...

  6. The Guideline of Setting Up Samba Server on linux(Ubuntu)

    The Guideline of Setting Up Samba Server on linux(Ubuntu) From terminate command window, install the ...

  7. JAVA深入研究——Method的Invoke方法(转)

    原文地址:http://www.cnblogs.com/onlywujun/p/3519037.html 在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一 ...

  8. Linux下postgres9.4 版本的单机版安装小笔记

    1.添加RPMyum install https://download.postgresql.org/pub/repos/yum/9.4/redhat/rhel-7-x86_64/pgdg-redha ...

  9. pytest文档13-allure2生成html报告(史上最详细)

    前言 allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架,也可以集成到Jenkins上展示高大上的报告界面. 环境准备 1. ...

  10. 【Java】【9】String Date Calendar之间的转换

    前言: 1, Calendar 转化 String 2, Calendar 转化 Date 3,Date 转化 String 4,Date 转化 Calendar 5,String 转化 Calend ...