文章目录

  • 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'

图片爬取数据解析数据持久化相关推荐

  1. 用python3爬取微博的数据和图片

    如何用python爬取微博的数据 这又是我正在学习崔庆才大佬的爬虫文章学习和体会到的啦,,, 正文 当我们浏览微博时,会发现微博网页下面都有下拉下载更多的选项,初始的页面只有几个微博的内容,当我们到最 ...

  2. 7位号段、运营商、归属地数据爬取与解析

    写在前面 批量获取与解析 单个爬取,数据量大,难度大 多线程.url禁止访问,,, 映射数据查询网站较多,多为单个查询 存在错误映射数据 爬取与解析 import re import time imp ...

  3. 简单爬取微博评论详细解析,学习爬取ajax异步数据交换动态网页

    爬取微博评论详细解析,学习爬取ajax异步数据交换动态网页 1.什么是ajax异步数据交换网页 2.用到的工具模块和简单解释 3.网页内容解析 4.代码实现及解释 1.什么是ajax异步数据交换网页 ...

  4. python pd.read_html 快速爬取网页表格数据与常规请求解析方式对比

    为爬取网页表格数据,较容想到的常规方式是通过requests请求以及lxml解析定位获取元素,此外还可以通过pandas库的read_html直接获取表格数据,得到的将是目标网页所有table表格的l ...

  5. Python爬虫:爬取喜马拉雅音频数据详解

    前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...

  6. Scrapy 通用爬虫爬取广西人才网数据记录(上,企业信息)

    2019独角兽企业重金招聘Python工程师标准>>> 背景 这一次的通用爬虫跟以往默认的spider不一样,它的爬取可以通过正则将范围扩大,而且它也不注重那么细的内容,能爬尽量爬. ...

  7. python 百度百科 爬虫_爬虫爬取百度百科数据

    以前段时间<青春有你2>为例,我们使用Python来爬取百度百科中<青春有你2>所有参赛选手的信息. 什么是爬虫? 为了获取大量的互联网数据,我们自然想到使用爬虫代替我们完成这 ...

  8. python爬去朋友圈_利用Python爬取朋友圈数据,爬到你开始怀疑人生

    人生最难的事是自我认知,用Python爬取朋友圈数据,让我们重新审视自己,审视我们周围的圈子. 文:朱元禄(@数据分析-jacky) 哲学的两大问题:1.我是谁?2.我们从哪里来? 本文 jacky试 ...

  9. python爬取app中的音频_Python爬取喜马拉雅音频数据详解

    码农公社  210.net.cn  210是何含义?10月24日是程序员节,1024 =210.210既 210 之意. Python爬取喜马拉雅音频数据详解 一.项目目标 爬取喜马拉雅音频数据 受害 ...

最新文章

  1. Rust 1.30带来更多元编程支持,并改进了模块系统
  2. MySQL优化篇:SHOW语法
  3. Golang init函数执行顺序
  4. Reinforcement Learning
  5. zabbix setup.php出错,apache配置zabbix下setup.php无法显示
  6. linux开发板调试,用arm-gdb和gdbserver调试开发板的方法
  7. 在Spark上运行WordCount程序
  8. PHP:同时发送多个异步ajax请求,但数据却是按同步顺序返回
  9. HyperLPR车牌识别库代码分析(11)
  10. 锤子手机T2发布会PPT模板
  11. web网页开发-前端
  12. 【CentOS8.0开启防火墙放行8081端口】
  13. python快乐数字怎么表达_Python中的快乐数字
  14. 超级玛丽跳 时间的优化
  15. 我的职业性格测评报告
  16. 小程序获取用户openid,php获取微信小程序openid的方法
  17. mathpix无法免费?识别公式终极版,看着这篇就够了
  18. 干货分享--企业微信社群促活的12种方式
  19. iPhone视频播放器(1)
  20. JAVA 生成同音字的方法,随机生成汉字,汉字转拼音,写的不好,望指正.谢谢~

热门文章

  1. 数据中心空调系统应急方案
  2. UPS远程监控系统的设计与实现
  3. 指针变量和引用变量的区别_指针Ⅰ--变量的定义
  4. flask-mail异步发送邮件_spring Boot手把手教学(6):发送邮件
  5. Py之gpxpy:gpxpy的简介、安装、使用方法之详细攻略
  6. 朴素贝叶斯法分类器的Python3 实现
  7. Linux常用命令 积累
  8. C++的简单文本IO
  9. 数据采集与分析的那些事——从数据埋点到AB测试
  10. guava-collections