爬取的网站:https://818ps.com/search/0-0-0-0-0-null-0_0_0_67-0-0-0-0.html
重点:分析需要在哪一块中寻找到图片地址,可以使用.*?来省略中间不需要的部分
ex = '.*?'
img_src_list = re.findall(ex, page_text, re.S)
代码:
import requests
import random
import re
import os
user_agent_list=[
'Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0)',
'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)',
'Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0)',
'Opera/9.80(WindowsNT6.1;U;en)Presto/2.8.131Version/11.11',
'Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)',
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60',
'Opera/8.0 (Windows NT 5.1; U; en)',
'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',
'Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'
]
if __name__ == '__main__':
# 创建一个文件夹,保存所有的图片
if not os.path.exists('./img'):
os.mkdir('./img')
# 如何爬取图片数据
url = 'https://818ps.com/search/0-0-0-0-0-null-0_0_0_67-0-0-0-0.html'
header = {
'User-Agent': random.choice(user_agent_list) }
# 使用通用爬虫对url对应的一整张页面进行爬取
page_text = requests.get(url=url, headers=header).text
# 使用聚焦爬虫将页面中所有的图片进行解析/提取 正则, 获取的是()中的.*?
ex = '.*?'
img_src_list = re.findall(ex, page_text, re.S)
# print(img_src_list)
for index,src in enumerate(img_src_list):
# 拼接出完整路径
if ("http" in src):
continue
else:
src = 'http:' + src
print(src)
# 请求到了图片的二进制数据
img_data = requests.get(url=src, headers=header).content
with open('./img/' + str(index) + '.jpg', 'wb') as fp:
fp.write(img_data)
bs4
bs4 实现数据解析原理:
- 1.实例化一个BeautifulSoup,并且将页面源码数据加载到该对象中
- 2.通过调用***BeautifulSoup对象***中相关的属性或者方法进行标签定位和数据提取
环境安装:
pip install bs4
pip install lxml
如何实例化BeautifulSoup对象:
from bs4 import BeautifulSoup
- 对象的实例化
- 1.将本地的HTML文档中的数据加载到该对象中
from bs4 import BeautifulSoup
if __name__ == '__main__':
# 将HTML文档中数据加载到BeautifulSoup对象中
fp = open('./colorPicker.html', 'r', encoding='utf-8')
soup = BeautifulSoup(fp, 'lxml')
print(soup)
* 2.将互联网上获取的页面源码加载到该对象中
bs4提供的用于数据解析的属性和方法
tagName
: soup.tagName 返回的是HTML中第一次出现的tagName标签 print(soup.li)
find()
: soup.find(‘div’) 相当于soup.div soup.find(‘div’, class_=‘aa’) 查找class为aa的div
find_all()
:soup.find_all(‘div’) 返回的是列表
select
:soup.select(’.aa’) 可以使用某种选择器属性去查找,也可以使用层级去查找 soup.select(’.aa > ul > li > a’), 返回的也是列表
get_text()
:获取标签之间的文本数据, soup.a.text/string/get_text()
['属性']
:获取标签的属性值, soup.a[‘href’]
实战练习:爬取三国演义所有章节标题和内容
爬取页面:https://www.shicimingju.com
页面代码:
from bs4 import BeautifulSoup
import requests
import random
if __name__ == '__main__':
header = {
'User-Agent': 'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)'}
url = 'https://www.shicimingju.com/book/sanguoyanyi.html'
page_text = requests.get(url=url, headers=header)
page_text.encoding = 'utf-8'
# 在首页中解析出章节的标题和详情页url
# 1.实例化BeautifulSoup对象,需要将页面源码数据加载到该对象中
soup = BeautifulSoup(page_text.text, 'lxml')
li_list = soup.select('.book-mulu > ul > li')
fp = open('./sanguo.txt', 'w', encoding='utf-8')
for li in li_list:
title = li.a.text
detail_url = 'https://www.shicimingju.com' + li.a['href']
# 对详情页发起请求,解析出章节内容
detail_content_text = requests.get(url=detail_url, headers=header)
detail_content_text.encoding = 'utf-8'
# 解析出详情页中相关章节内容
detail_soup = BeautifulSoup(detail_content_text.text, 'lxml')
div_tag = detail_soup.find('div', class_='chapter_content')
# 解析到了章节的内容
content = div_tag.text
# 持久化存储
fp.write(title+':'+ content + '\n')
print(title + '---爬取成功!')
xpath
xpath解析:最常用且最便捷高效的一种解析方式。通用性。
xpath解析原理
- 1.实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
- 2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。
环境的安装
pip install lxml
如何实例化etree对象
- 1.将本地的HTML文档中源码数据加载到etree对象中: etree.parse()
- 2.可以将从互联网上获取的源码数据加载到该对象中: etree.HTML(‘page_text’)
xpath(‘xpath表达式’)
例子:
tree = etree.parse('test.html')
tree.xpath('/html/head/title') //此时返回的是存储地址
xpath表达式
/
:表示的是从根节点开始定位。表示的是一个层级
//
:表示的是多个层级。可以从任意位置开始定位
[@class="属性值"]
: 属性定位 //div[@class=“aa”] //div[@class=“aa”]/ul/li
[1]
:索引定位,索引是从1开始的 //div[3]
text()
:取文本 ** //div[3]/a/text() ** /text() 获取标签中直系的文本内容 //text() 获取标签中非直系的文本内容(所有的文本内容)
/@attrName img/@src
:
xpath实战
图片解析下载
图片来源:彼岸图网
代码:
import requests
from lxml import etree
import os
if __name__ == '__main__':
# 创建一个文件夹,保存所有的图片
if not os.path.exists('./img'):
os.mkdir('./img')
url = 'http://pic.netbian.com/4kmeinv/'
header = {
'User-Agent': 'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)'}
page = requests.get(url=url, headers=header)
page.encoding = 'gbk'
page_text = page.text
tree = etree.HTML(page_text)
# 数据解析,src的数据值
li_list = tree.xpath('//div[@class="slist"]/ul/li')
for li in li_list:
imgsrc = 'http://pic.netbian.com' + li.xpath('./a/img/@src')[0]
imgname = li.xpath('./a/img/@alt')[0] + '.jpg'
# 通用处理中文乱码的解决方案
# imgname.encode('iso-8859-1').decode('gbk')
# 图片持久化存储
img_data = requests.get(url=imgsrc, headers=header).content
with open('./img/' + imgname, 'wb') as fp:
fp.write(img_data)
print(imgname, imgsrc, '存储成功')
原理概述
- 解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储
- 1.进行指定标签的定位
- 2.标签或者标签对应的属性中存储的数据值进行提取(解析)