爬虫爬取百度搜狗图片持久化存储

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).content
if ‘token‘ not in img_url:
with open(‘./baidupics/%s‘%img_url.split(‘/‘)[-1], ‘wb‘) as f:
f.write(content)

# 搜狗图片:
import requests
import re

url = ‘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).content
name = 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_id
find_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()-1
res.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‘
4.mongodb

5.mysql

原文地址:https://www.cnblogs.com/huanghaobing/p/11755238.html

时间: 2024-08-03 21:53:43

爬虫爬取百度搜狗图片持久化存储的相关文章

Python简易爬虫爬取百度贴吧图片

通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地.(Python版本为3.6.0) 一.获取整个页面数据 def getHtml(url): page=urllib.request.urlopen(url) html=page.read() return html 说明: 向getHtml()函数传递一个网址,就可以把整个页面下载下来. urllib.request 模块提供了读取web页面数据的接口,我们可以像读取本地文件一样读取www和ftp上的数据. 二.筛选页面

Python爬虫爬取百度贴吧的图片

根据输入的贴吧地址,爬取想要该贴吧的图片,保存到本地文件夹,仅供参考: #!/usr/bin/python#_*_coding:utf-8_*_import urllibimport urllib2import reimport osimport sys reload(sys)sys.setdefaultencoding("utf-8")#下载图片class GetPic: #页面初始化 def __init__(self,baseUrl,seelz): #base链接地址 self.

Python爬虫爬取百度贴吧的帖子

同样是参考网上教程,编写爬取贴吧帖子的内容,同时把爬取的帖子保存到本地文档: #!/usr/bin/python#_*_coding:utf-8_*_import urllibimport urllib2import reimport sys reload(sys)sys.setdefaultencoding("utf-8")#处理页面标签,去除图片.超链接.换行符等class Tool: #去除img标签,7位长空格 removeImg = re.compile('<img.*

python爬虫——爬取NUS-WIDE数据库图片

实验室需要NUS-WIDE数据库中的原图,数据集的地址为http://lms.comp.nus.edu.sg/research/NUS-WIDE.htm   由于这个数据只给了每个图片的URL,所以需要一个小爬虫程序来爬取这些图片.在图片的下载过程中建议使用VPN.由于一些URL已经失效,所以会下载一些无效的图片. 1 # PYTHON 2.7 Ubuntu 14.04 2 nuswide = "$NUS-WIDE-urls_ROOT" #the location of your nu

python爬虫—爬取百度百科数据

爬虫框架:开发平台 centos6.7 根据慕课网爬虫教程编写代码 片区百度百科url,标题,内容 分为4个模块:html_downloader.py 下载器 html_outputer.py 爬取数据生成html模块 html_parser 获取有用数据 url_manager url管理器 spider_main 爬虫启动代码 spider_main.py 1 #!/usr/bin/python 2 #-*- coding: utf8 -*- 3 4 import html_download

Python爬虫——爬取网站的图片

爬虫这东西最早出现在我大学计算机网络的课程上面,我们当时的老师人很好,期末不笔试,他说这东西笔试没什么用,对于一个年纪比较大的老师来讲,能提出这种方式,实在难得.当时在考虑做一个与网络有关的东西好,第一个想到的就是爬虫.想想也没想过用Java写过这种东西,所以当时是一般看一本爬虫的书一边敲代码,现在想起来有很多东西是没有想明白的--我当时爬的是刘末鹏的博客,把全部文章用分类爬了下来,在本地可以打开. 后面老师评价的时候就说,你这个只能爬这个,其实你应该让他智能些,让他可以爬图片,可以爬特定的内容

爬虫爬取百度词条

页面是随时升级的,所以现在的链接不代表以后的链接,但是万变不离其宗,只要学会解析页面,那么就能走的更远. 码云链接:https://gitee.com/ALADL/baike_spider.git from baike_spider import url_manager,html_downloader, html_parser, html_outputer class SpiderMain(object): def __init__(self): # 初始化各个对象 self.urls = ur

Python爬虫-爬取百度贴吧帖子

这次主要学习了替换各种标签,规范格式的方法.依然参考博主崔庆才的博客. 1.获取url 某一帖子:https://tieba.baidu.com/p/3138733512?see_lz=1&pn=1 其中https://tieba.baidu.com/p/3138733512?为基础部分,剩余的为参数部分. http://  代表资源传输使用http协议 tieba.baidu.com 是百度的二级域名,指向百度贴吧的服务器. /p/3138733512 是服务器某个资源,即这个帖子的地址定位符

java网络爬虫爬取百度新闻

采用commons-httpclient commons-httpclient是一个遗留版本,现在官方已经不推荐使用了. lucene采用4.3版本 所需jar包 package com.lulei.util; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream;