图片爬取数据解析数据持久化
文章目录
- 1、图片下载
- 2、JS动态渲染
- 3、数据解析
- 4、持久化存储
1、图片下载
百度图片:http://image.baidu.com/
搜狗图片:https://pic.sogou.com/
# 图片爬取:
1).寻找图片下载的url: elements与network抓包
2).浏览器中访问url, 进行验证
3).编写代码获取url
4).请求url地址, 获取二进制流
5).将二进制流写入文件
# 百度图片:
import time
import requests
from lxml import etree
from selenium import webdriver# 实例化浏览器对象
browser = webdriver.Chrome('./chromedriver.exe')# 访问网页并操控网页元素获取搜索结果
browser.get('http://image.baidu.com/')
input_tag = browser.find_element_by_id('kw')
input_tag.send_keys('熊二')
search_button = browser.find_element_by_class_name('s_search')
search_button.click()# 通过js实现鼠标向下滚动, 获取更多页面源码
js = 'window.scrollTo(0, document.body.scrollHeight)'
for times in range(3):browser.execute_script(js)time.sleep(3)
html = browser.page_source# 解析数据获取图片连接:
tree = etree.HTML(html)
url_list = tree.xpath('//div[@id="imgid"]/div/ul/li/@data-objurl')
for img_url in url_list:headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'}content = requests.get(url=img_url, headers=headers).contentif 'token' not in img_url:with open('./baidupics/%s'%img_url.split('/')[-1], 'wb') as f:f.write(content)
# 搜狗图片:
import requests
import reurl = 'http://pic.sogou.com/pics?'
params = {'query': '熊二'
}
res = requests.get(url=url, params=params).text
url_list = re.findall(r',"(https://i\d+piccdn\.sogoucdn.com/.*?)"]', res)
for img_url in url_list:headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'}print(img_url)content = requests.get(url=img_url, headers=headers).contentname = img_url.split('/')[-1] + '.jpg'with open('./sougoupics/%s.jpg'%name, 'wb') as f:f.write(content)
2、JS动态渲染
1).selenium爬取: selenium测试框架, 完全模人操作浏览器, *** page_source ***
2).基础语法:from selenium import webdriver# 实例化浏览器对象:browser = webdriver.Chrome('浏览器驱动路径') # 在当前路径下: './chromedriver.exe'# 访问响应的url地址:browser.get(url)# 获取页面元素:find_element_by_idfind_element_by_name(): name是标签的name属性值find_element_by_class_name: class的属性值find_element_by_xpath: 根据xpath表达式定位元素find_element_by_css_selector:根据css选择器# 示例:获取一个id为kw的input输入框input_tag = browser.find_element_by_id('kw')# 输入内容:input_tag.clear()input_tag.send_keys('乔碧萝殿下')# 点击button按钮:button.click()# 执行JS代码:js = 'window.scrollTo(0, document.body.scrollHeight)'for i in range(3):browser.execute_script(js)# 获取HTML源码: 记住没有括号*****html = browser.page_source # str类型# 数据解析工作:1).xpath提取数据:2).正则提取: 正则表达式的书写 + re模块的使用3).Beautifulsoup: CSS选择器 -->(节点选择器, 方法选择器, CSS选择器)# 媒体类型: 视频, 图片, 压缩包, 软件安装包1).下载链接2).requests请求: response.content --> 二进制流scrapy框架: response.body --> 二进制流3).写文件:with open('./jdkfj/name', 'wb') as f:f.write(res.content | response.body)
3、数据解析
1.Xpath
# 编码流程from lxml import etree# 实例化etree对象 tree = etree.HTML(res.text) # 调用xpath表达式提取数据li_list = tree.xpath('xpath表达式') # xpath提取的数据在列表中# 嵌套for li in li_list:li.xpath('xpath表达式')# ./# .//# 基础语法:./:从当前的根节点向下匹配../:从当前节点下的任意位置匹配nodeName: 节点名定位nodename[@attributename="value"]: 根据属性定位单属性多值匹配:contains--> div[contains(@class, "item")]多属性匹配: and --> div[@class="item" and @name="divtag"]@attributename: 提取其属性值text(): 提取文本信息# 按序选择:1).索引定位: 索引从1开始, res.xpath('//div/ul/li[1]/text()'): 定位第一个li标签requests模块请求的响应对象:res.text-->文本res.json()-->python的基础数据类型 --> 字典res.content--> 二进制流2).last()函数定位: 最后一个, 倒数第二个:last()-1res.xpath('//div/ul/li[last()]'): 定位最后一个res.xpath('//div/ul/li[last()-1]'): 定位倒数第二个3).position()函数: 位置res.xpath('//div/ul/li[position()<4]')2.BS4基础语法:
# 编码流程:from bs4 import BeautifulSoup# 实例化soup对象soup = BeautifulSoup(res.text, 'lxml')# 定位节点soup.select('CSS选择器')
# CSS选择器语法:id: #class: .soup.select('div > ul > li') # 单层级选择器soup.select('div li') # 多层级选择器
# 获取节点的属性或文本:tag.string: 取直接文本 --> 当标签中除了字节文本, 还包含其他标签时, 取不到直接文本tag.get_text(): 取文本tag['attributename']: 取属性(试试属性有两个(包含)值以上时返回的数据类型)
3.正则 & re模块
分组 & 非贪婪匹配:() --> 'dfkjd(kdf.*?dfdf)dfdf'<a href="https://www.baidu.com/kdjfkdjf.jpg">这是一个a标签</a> --> '<a href="(https://www.baidu.com/.*?\.jpg)">'
量词:+ : 匹配1次或多次* : 匹配0次获取多次{m}: 匹配m次{m,n}: 匹配m到n次{m,}: 至少m次{,n}: 至多n次
re模块:re.findall('正则表示', res.text) --> list列表
4、持久化存储
1.txt
############# 写入txt文件 ###############if title and joke and comment:# with open('qbtxt.txt', 'a', encoding='utf-8') as txtfile:# txtfile.write('&'.join([title[0], joke[0], comment[0]]))# txtfile.write('\n')# txtfile.write('********************************************\n')2.json############# 写入json文件 ################# dic = {'title': title[0], 'joke':joke[0], 'comment':comment[0]}# with open('jsnfile.json', 'a', encoding='utf-8') as jsonfile:# jsonfile.write(json.dumps(dic, indent=4, ensure_ascii=False))# jsonfile.write(','+'\n')3.csv
############# 写入CSV文件 ##################with open('csvfile.csv', 'a', encoding='utf-8') as csvfile:writer = csv.writer(csvfile, delimiter=' ')writer.writerow([title[0], joke[0], comment[0]])
############# scrapy框架 ###################FEED_URI = 'file:///home/eli/Desktop/qtw.csv'FEED_FORMAT = 'CSV'
图片爬取数据解析数据持久化相关推荐
- 用python3爬取微博的数据和图片
如何用python爬取微博的数据 这又是我正在学习崔庆才大佬的爬虫文章学习和体会到的啦,,, 正文 当我们浏览微博时,会发现微博网页下面都有下拉下载更多的选项,初始的页面只有几个微博的内容,当我们到最 ...
- 7位号段、运营商、归属地数据爬取与解析
写在前面 批量获取与解析 单个爬取,数据量大,难度大 多线程.url禁止访问,,, 映射数据查询网站较多,多为单个查询 存在错误映射数据 爬取与解析 import re import time imp ...
- 简单爬取微博评论详细解析,学习爬取ajax异步数据交换动态网页
爬取微博评论详细解析,学习爬取ajax异步数据交换动态网页 1.什么是ajax异步数据交换网页 2.用到的工具模块和简单解释 3.网页内容解析 4.代码实现及解释 1.什么是ajax异步数据交换网页 ...
- python pd.read_html 快速爬取网页表格数据与常规请求解析方式对比
为爬取网页表格数据,较容想到的常规方式是通过requests请求以及lxml解析定位获取元素,此外还可以通过pandas库的read_html直接获取表格数据,得到的将是目标网页所有table表格的l ...
- Python爬虫:爬取喜马拉雅音频数据详解
前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...
- Scrapy 通用爬虫爬取广西人才网数据记录(上,企业信息)
2019独角兽企业重金招聘Python工程师标准>>> 背景 这一次的通用爬虫跟以往默认的spider不一样,它的爬取可以通过正则将范围扩大,而且它也不注重那么细的内容,能爬尽量爬. ...
- python 百度百科 爬虫_爬虫爬取百度百科数据
以前段时间<青春有你2>为例,我们使用Python来爬取百度百科中<青春有你2>所有参赛选手的信息. 什么是爬虫? 为了获取大量的互联网数据,我们自然想到使用爬虫代替我们完成这 ...
- python爬去朋友圈_利用Python爬取朋友圈数据,爬到你开始怀疑人生
人生最难的事是自我认知,用Python爬取朋友圈数据,让我们重新审视自己,审视我们周围的圈子. 文:朱元禄(@数据分析-jacky) 哲学的两大问题:1.我是谁?2.我们从哪里来? 本文 jacky试 ...
- python爬取app中的音频_Python爬取喜马拉雅音频数据详解
码农公社 210.net.cn 210是何含义?10月24日是程序员节,1024 =210.210既 210 之意. Python爬取喜马拉雅音频数据详解 一.项目目标 爬取喜马拉雅音频数据 受害 ...
最新文章
- Rust 1.30带来更多元编程支持,并改进了模块系统
- MySQL优化篇:SHOW语法
- Golang init函数执行顺序
- Reinforcement Learning
- zabbix setup.php出错,apache配置zabbix下setup.php无法显示
- linux开发板调试,用arm-gdb和gdbserver调试开发板的方法
- 在Spark上运行WordCount程序
- PHP:同时发送多个异步ajax请求,但数据却是按同步顺序返回
- HyperLPR车牌识别库代码分析(11)
- 锤子手机T2发布会PPT模板
- web网页开发-前端
- 【CentOS8.0开启防火墙放行8081端口】
- python快乐数字怎么表达_Python中的快乐数字
- 超级玛丽跳 时间的优化
- 我的职业性格测评报告
- 小程序获取用户openid,php获取微信小程序openid的方法
- mathpix无法免费?识别公式终极版,看着这篇就够了
- 干货分享--企业微信社群促活的12种方式
- iPhone视频播放器(1)
- JAVA 生成同音字的方法,随机生成汉字,汉字转拼音,写的不好,望指正.谢谢~