网站怎么做图片搜索攀枝花网站网站建设
2026/4/13 11:11:52 网站建设 项目流程
网站怎么做图片搜索,攀枝花网站网站建设,深圳广告宣传片拍摄,网站建立不安全目录 requests Response对象 getpost提交 通用框架 BeautifulSoup 创建解析对象 解析标签 标签遍历 搜索文档树 lxml 选择解析方式 xpath Selenium 配置驱动 页面操作 获取页面属性 定位元素 鼠标模拟操作 键盘模拟操作 等待 反爬策略 代理 随机延…目录requestsResponse对象getpost提交通用框架BeautifulSoup创建解析对象解析标签标签遍历搜索文档树lxml选择解析方式xpathSelenium配置驱动页面操作获取页面属性定位元素鼠标模拟操作键盘模拟操作等待反爬策略代理随机延迟验证码处理Scrapy组成创建scrapy项目定义Item创建spider脚本运行spider脚本requests对网站模拟发起请求库Response对象参数import requests ​ url https://www.jd.com r requests.get(url) r.encoding r.apparent_encoding # 设置使用的编码和解析出来的方法一致 print(r.status_code) # 获取响应状态码 print(r.url) # 获取请求的url print(r.headers) # 获取响应头 print(r.text) # 获取经过编码后的响应文本内容 print(r.content) # 获取未经编码的响应文本内容二进制数据 print(r.encoding) # http响应头中的编码字段text方法根据该值进行解码若为空则默认为ISO-8859-1 print(r.apparent_encoding) # 根据响应内容解析出来的编码 print(r.cookies) # 获取cookie print(r.request.headers) # 获取发送请求的请求头 session request.session() # 获取一个会话getpost提交postimport requests ​ uname G0od!JAVA3C41PTISAGO upass 1pt_Pa4sW0rd_K3y_H3re ​ url http://172.29.1.2/Ch3ck_Au7h.php para { # 提交参数为字典 uname: uname, upass: upass } r requests.post(urlurl,datapara) print(r.text)定制请求参数import requests ​ # 自定义请求头 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0 } # 自定义参数 para { key: 羊毛 } url https://www.jd.com/ r requests.get(url,headersheaders,paramspara) # 对url发起get请求并设置请求头和get参数 r.encoding r.apparent_encoding # 设置使用的编码和解析出来的方法一致 ​ print(r.text)requests.request用法res requests.request(GET, url, paramsNone) # 方法 url 控制访问参数 # 控制访问参数 # params 字典或字节序列 作为参数增加到url中 get常用 # data 字典、字节序列或文件对象 作为request的内容 post常用 # json JSON格式的数据 作为request的内容 # headers 字典 http定制头 # cookies 字典或CookieJar 作为request的cookie # auth 元组 作为http认证 # files 字典 传输文件 键为文件名值为open函数打开的文件 # timeout 设置超时时间(单位为秒) # allow_redirects True/False 默认为true 重定向开关 # stream True/False 默认为true 获取内容自动下载开关 # verify True/False 默认为true 认证SSL证书开关 # cert 使用本地SSL证书路径通用框架import requests def getHTMLText(url): try: r requests.get(url) r.raise_for_status() # 如果状态不是200引发HTTPError异常 r.encoding r.apparent_encoding # 根据编码内容设置编码格式 return r.text except: return 产生异常 if __name__ __main__: url http://www.baidu.com print(getHTMLText(url))BeautifulSoup创建解析对象import requests from bs4 import BeautifulSoup # 导入beautifulsoup库 ​ url https://www.jd.com/ r requests.get(url) # 对url发起get请求并设置请求头和get参数 r.encoding r.apparent_encoding # 设置使用的编码和解析出来的方法一致 h r.text soup BeautifulSoup(h,featureshtml.parser) # 创建对象(可以是字符串作为参数也可以使用open(test.html)打开html文件) 也叫封装为文档树解析标签通过属性的方式获取内容包含标签本身# 获取标签 ​ soup.a # 获取第一个a标签所有内容 soup.title soup.head soup.body soup.img soup.div ....... ​ # 格式化输出 soup.prettify() # 过滤方法 ​ soup.div[id] # 获取div标签的第一个id的值 # 基本元素属性 ​ soup.a.name # 获取标签的名字 soup.a.parent.name # 获取父标签的名字 soup.a.attrs # 获取标签所有的属性 返回一个字典 soup.a.contents # 获取标签的文本 返回一个列表 以标签分割 包括换行 soup.a.string # 获取标签的直接文本 返回一个字符串 soup.a.text # 获取标签内所有的文本 返回一个字符串标签遍历# 遍历标签下的所有子标签 for child in soup.div.children: print(child) # 遍历标签的所有父标签 for parent in soup.div.parents: print(parent)搜索文档树# find_all() 返回所有匹配标签节点的列表 ​ soup.find_all(nameTrue) # 获取所有标签 soup.find_all(a) # 字符串搜索 获取所有a标签 soup.find_all(re.compile(a)) # 正则搜索 soup.find_all([meta,link]) # 列表内容搜索 soup.find_all(idlink) # 获取idlink的所有标签支持任意标签查找 soup.find_all(idTrue) # 获取有id属性的标签 soup.find_all(class_test) # 获取class为test的标签class_与class区分 soup.find_all(stringtest) # 获取文本内容有test的标签 返回文本信息列表 #选择多个用列表如class_[test1,test2] ​ # find()返回第一个匹配的标签节点 ​ # 用法与find_all()一致 # select() 返回所有匹配的标签节点列表 (css选择器) ​ soup.select(a) # 获取所有的a标签 soup.select(p a) # 获取p标签下的a所有标签 soup.select(pa) # 获取p标签下的直接子节点的a所有标签 soup.select(.test) # 获取class属性值为test的所有标签 soup.select(a.test) # 获取a标签中class属性值为test的所有标签 soup.select(.a1.a2) # 获取class属性值为a1的标签中查找class属性值为a2的所有标签 soup.select(#test) # 获取id为test的所有标签 soup.select(p #test) # 获取p标签下的id为test的所有标签 soup.select(a[href]) # 获取a标签中存在href属性的所有标签 soup.select(a[hrefwww.baidu.com]) # 获取a标签中属性为www.baidu.com所有的标签 # 多个用,隔开lxml解析html选择解析方式# 1.从字符串解析 from lxml import etree ​ html html body div classcontent h1标题/h1 p段落文本/p /div /body /html tree etree.HTML(html) ​ # 2.从文件中解析 # 方法1 with open(example.html, r, encodingutf-8) as f: tree etree.HTML(f.read()) # 方法2 tree etree.parse(example.html, etree.HTMLParser())xpath基本选择器符号描述示例匹配结果/从根节点开始的绝对路径/html/body/div根节点下的div//任意层级的节点全局搜索//div文档中的所有div.当前节点./span当前节点下的直接span..当前节点的父节点../li当前节点的父级li选择属性//a/href所有a标签的href属性谓语过滤示例描述//li[1]第一个li节点XPath 索引从 1 开始//li[last()]最后一个li节点//li[last()-1]倒数第二个li节点//li[classitem]所有classitem的li节点//li[a]包含a子节点的li节点//li[text()item]文本内容为 item 的li节点通配符通配符描述示例匹配结果*任意元素节点//div/*所有div的直接子节点*任意属性//a/*所有a标签的所有属性node()任意类型的节点//div/node()div内的所有节点包括文本、注释等轴轴名称描述示例匹配结果child当前节点的直接子节点//div/child::pdiv的直接子pdescendant当前节点的所有后代节点//div/descendant::pdiv内的所有p无论嵌套多深parent当前节点的父节点//p/parent::divp的父级divancestor当前节点的所有祖先节点//span/ancestor::divspan的所有div祖先following当前节点之后的所有节点//li/following::li当前li之后的所有lipreceding当前节点之前的所有节点//li/preceding::li当前li之前的所有liattribute当前节点的属性//a/attribute::hrefa的href属性运算符运算符描述示例and逻辑与//li[classitem and id]or逻辑或//li[classitem or id]等于//a[hreflink.html]!不等于//a[href!link.html]大于//li[position() 3]函数函数名描述示例结果text()获取节点的文本内容//a/text()a标签的文本内容contains()判断属性或文本是否包含特定值//div[contains(class, box)]所有class包含 box 的divstarts-with()判断属性或文本是否以特定值开头//a[starts-with(href, http)]所有href以 http 开头的aposition()获取节点在同级中的位置//li[position() 3]前三个li节点last()获取最后一个节点的位置//li[last()]最后一个li节点使用方法import requests from lxml import etree ​ url http://www.baidu.com req requests.get(url) req.encoding req.apparent_encoding tree etree.HTML(req.text) # 创建一个etree对象 elem tree.xpath(//*[classtitle-content-title]/text()) # 获取所有节点下指定的class值的文本信息 返回列表 print(elem)Selenium配置驱动1. 下载对应浏览器的webdriver EdgeDriverhttps://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ ChromeDriverhttps://googlechromelabs.github.io/chrome-for-testing/#stable 2. 将exe放入python安装目录的script目录下 3. 配置系统环境变量页面操作from selenium import webdriver ​ option webdriver.EdgeOptions() # 初始化edge浏览器配置对象 option.add_experimental_option(detach, True) # 配置不自动关闭 edge webdriver.Edge(optionsoption) # 初始化edge浏览器对象并使用配置 ​ # 窗口大小设置 edge.maximize_window() # 全屏窗口 edge.set_window_size(500,500) # 设置大小 ​ # 前进与后退 edge.forward() # 前进 edge.back() # 后退 ​ edge.get(https://taobao.com) # 自动化打开一个网页 ​ # 页面关闭 edge.close() # 关闭当前页 edge.quit() # 关闭整个浏览器获取页面属性from selenium import webdriver ​ option webdriver.EdgeOptions() # 初始化edge浏览器配置对象 option.add_experimental_option(detach, True) # 配置不自动关闭 edge webdriver.Edge(optionsoption) # 初始化edge浏览器对象并使用配置 edge.get(http://baidu.com) ​ print(edge.title) # 获取页面标题 print(edge.current_url) # 获取当前URL print(edge.name) # 获取浏览器名称 print(edge.page_source) # 获取页面源码定位元素定位方法find_element() # 返回第一个匹配的对象 find_elements() # 返回所有匹配的对象列表属性用法CLASSfind_element(byBy.CLASS_NAME, value)XPATHfind_element(byBy.XPATH, value)CSSfind_element(byBy.CSS_SELECTOR, value)IDfind_element(byBy.ID, value)# xpath定位方法 ​ from selenium import webdriver from selenium.webdriver.common.by import By # 导入定位库 ​ # 初始化配置 edge webdriver.Edge() ​ edge.get(http://baidu.com) # 关键字传参要么都写要么都不写 elem edge.find_element(byBy.XPATH, value//span[classtitle-content-title]) print(elem.text)鼠标模拟操作操作函数右击context_click()双击double_click()拖拽double_and_drop()悬停move_to_element()执行perform()from selenium import webdriver from selenium.webdriver.common.by import By # 导入定位库 ​ # 初始化配置 option webdriver.EdgeOptions() option.add_experimental_option(detach, True) edge webdriver.Edge(optionsoption) ​ edge.get(http://baidu.com) # 选中元素 elem edge.find_element(By.XPATH, //span[classtitle-content-title]) elem.click() # 单击键盘模拟操作操作函数删除键send_keys(Keys.BACK_SPACE)空格键send_keys(Keys.SPACE)制表键send_keys(Keys.TAB)回退键send_keys(Keys.ESCAPE)回车send_keys(Keys.ENTER)全选send_keys(Keys.CONTRL,a)复制send_keys(Keys.CONTRL,c)剪切send_keys(Keys.CONTRL,x)F1键send_keys(Keys.F1)输入asend_keys(Keys.INSERT,a)直接传值send_keys(a)from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys # 导入键盘库 ​ # 初始化配置 option webdriver.EdgeOptions() option.add_experimental_option(detach, True) edge webdriver.Edge(optionsoption) edge.get(http://baidu.com) ​ elem edge.find_element(By.XPATH, //input[classs_ipt]) # 选择输入框 elem.send_keys(Keys.INSERT,a) # 输入a elem.send_keys(Keys.ENTER) # 回车等待如果遇到使用ajax加载的网页页面元素可能不是同时加载出来的这个时候尝试在get方法执行完成时获取网页源代码可能并非浏览器完全加载完成的页面。所以这种情况下需要设置延时等待一定时间确保全部节点都加载出来等待方式方法描述强制等待time.sleep(n)强制等待n秒使用time模块的time.sleep()隐式等待implicitly_wait(n)如果到时间有元素节点没有加载出来就会抛出异常显式等待WebDriverWait()设置一个等待时间和一个条件在规定时间内每隔一段时间查看下条件是否成立如果成立那么程序就继续执行否则就抛出一个超时异常。# 显示等待函数参数 driver: 浏览器驱动 timeout: 超时时间等待的最长时间同时要考虑隐性等待时间 poll_frequency: 每次检测的间隔时间默认是0.5秒 ignored_exceptions:超时后的异常信息默认情况下抛出NoSuchElementException异常 until(method,message) method: 在等待期间每隔一段时间调用这个传入的方法直到返回值不是False message: 如果超时抛出TimeoutException将message传入异常 until_not(method,message): 与until相反until是当某元素出现或什么条件成立则继续执行until_not是当某元素消失或什么条件不成立则继续执行参数也相同。 # 显示等待 ​ from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as ec # 导入监测条件库 from selenium.webdriver.support.wait import WebDriverWait # 导入显示等待库 ​ # 初始化配置 option webdriver.EdgeOptions() option.add_experimental_option(detach, True) edge webdriver.Edge(optionsoption) edge.get(http://baidu.com) ​ elem edge.find_element(By.XPATH, //input[classs_ipt]) # 选择输入框 ​ try: # 表示在20s内每0.5s监测一次 wait WebDriverWait(edge, 20, 0.5) # 获取一个显示等待对象 elem.send_keys(Keys.INSERT, a) # 输入a wait.until(ec.element_to_be_clickable(elem)) # 监测条件 elem.send_keys(Keys.ENTER) # 回车 except: pass ​ from selenium.webdriver.support import expected_conditions as EC # 判断标题是否和预期的一致 title_is # 判断标题中是否包含预期的字符串 title_contains # 判断指定元素是否加载出来 presence_of_element_located ex: wait.until(EC.presence_of_element_located((By.XPATH, //div[classhaha]))) # 判断所有元素是否加载完成 presence_of_all_elements_located # 判断某个元素是否可见. 可见代表元素非隐藏并且元素的宽和高都不等于0传入参数是元组类型的locator visibility_of_element_located # 判断元素是否可见传入参数是定位后的元素WebElement visibility_of # 判断某个元素是否不可见或是否不存在于DOM树 invisibility_of_element_located # 判断元素的 text 是否包含预期字符串 text_to_be_present_in_element # 判断元素的 value 是否包含预期字符串 text_to_be_present_in_element_value #判断frame是否可切入可传入locator元组或者直接传入定位方式id、name、index或WebElement frame_to_be_available_and_switch_to_it #判断是否有alert出现 alert_is_present #判断元素是否可点击 element_to_be_clickable # 判断元素是否被选中,一般用在下拉列表传入WebElement对象 element_to_be_selected # 判断元素是否被选中 element_located_to_be_selected # 判断元素的选中状态是否和预期一致传入参数定位后的元素相等返回True否则返回False element_selection_state_to_be # 判断元素的选中状态是否和预期一致传入参数元素的定位相等返回True否则返回False element_located_selection_state_to_be #判断一个元素是否仍在DOM中传入WebElement对象可以判断页面是否刷新了 staleness_of反爬策略代理import requests ​ url https://www.ptpress.com.cn # 定义代理ip池 proxies [ {http: http://119.28.51.117:80}, {http: http://112.213.97.68:80}, {http: http://119.28.188.102:80} ] for proxy in proxies: try: response requests.get(url, proxiesproxy) except: print(此代理IP不可用) else: print(此代理IP可用, proxy) print(响应状态码:, response.status_code)随机延迟import requests import random import time ​ header { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0 } ​ for i in range(0,250,25): url fhttps://movie.douban.com/top250?start{i}filter req requests.get(url, headersheader) sleep_time random.randint(0,2) random.random() time.sleep(sleep_time) # 随机等待延迟验证码处理图片验证码pytesseract需要预先安装tesseract-ocr.exepython中将pytesseract的tesseract_cmd参数修改为exe路径# 识别思路 ​ 1. 获取验证码图片 2. 将图片转为灰度图 3. 将图片转为二值图 4. 用OCR技术识别(光学字符识别) import pytesseract from io import BytesIO ​ session requests.session() url http://www.daimg.com/include/vdimgck.php r session.get(url) img Image.open(BytesIO(r.content)) code pytesseract.image_to_string(img) # 识别图像文字 print(code) # 实例 ​ from bs4 import BeautifulSoup import requests from PIL import Image import pytesseract from io import BytesIO import re ​ header { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0 } url http://www.daimg.com/member/login.php session requests.session() session.headers header req session.get(url) req.encoding req.apparent_encoding soup BeautifulSoup(req.text, html.parser) elem soup.select(#vdimgck, )[0][src] url http://www.daimg.com/ elem[3:] r session.get(url) img Image.open(BytesIO(r.content)) code re.findall(r\w,pytesseract.image_to_string(img))[0] print(原图识别:, code) img img.convert(L) # 将图像转成灰度图L为灰度图1为二值图(table,1) code re.findall(r\w,pytesseract.image_to_string(img))[0] print(灰度图识别:, code) table [] # 定义二值化列表 th 127 # 定义二值化阈值 # 将像素小于阈值的填充0(黑色),大于填充1(白色) for i in range(256): if i th: table.append(0) else: table.append(1) img img.point(table, 1) # 二值化1为二值图 code re.findall(r\w,pytesseract.image_to_string(img))[0] print(二值图识别:, code) img.show() 点触验证码 # 识别思路 ​ 1. 截取全屏 2. 根据坐标截取验证码区域图片 3. 上传至超级鹰平台获取坐标 4. 模拟点击Scrapy爬虫框架组成组件功能Engine引擎负责处理系统的数据流、触发事务是整个框架的核心Scheduler调度器负责处理所有的Request并按照一定的方式将其进行整理、排列和入队。此外Scheduler可以自动去除重复的URL如果特定Request的URL不需要去重也可以通过设置实现如POST请求Downloader下载器负责下载网页内容Spider负责解析所有的Response提取Item所需的数据和新的URL。用户可以在一个项目中编写多个Spider每个负责处理一个特定或一些网站Item Pipeline项目管道负责处理Item常见的处理有清理、验证和存储数据等Downloader Middleware下载中间件位于Engine和Downloader之间可以自定义扩展下载功能如自动更换User-Angent、设置代理IP等Spider MiddlewareSpider中间件位于Engine和Spider之间可以自定义扩展Engine和Spider间通信的功能创建scrapy项目scrapy startproject name [path] # 创建scrapy项目name/ scrapy.cfg # 项目的配置文件 name/ __init__.py # 空文件将其上级目录变成一个模块 items.py # 项目的目标文件 pipelines.py # 项目的管道文件 settings.py # 项目的设置文件 spiders/ # 项目的Python模块将会从这里引用代码 __init__.py定义Item# items.py # Item对象来实现将爬取到的数据转换成结构化数据的功能实现方法是定义Item类继承scrapy.Item类并定义类中的数据类型为scrapy.Filed字段该文件已提供一个模板类 ​ class NewsItem(scrapy.Item): #定义NewsItem类 # 定义结构化数据 index scrapy.Field() #定义排名 title scrapy.Field() #定义标题 link scrapy.Field() #定义链接 newsNum scrapy.Field() #定义搜索结果个数创建spider脚本scrapy genspider [template] name domain ​ # template: 表示创建模板的类型缺省则使用默认模板 # name: 表示创建的spider脚本名称创建后会在spiders目录下生成一个以name命名的.py文件 # domain: 表示要爬取网站的域名 ​ # 需要先cd进入spiders目录下执行命令 # ex: scrapy genspider news www.baidu.com # 生成的spider脚本 ​ import scrapy ​ class NewsSpider(scrapy.Spider): name news # 爬虫名称具备唯一性 allowed_domains [www.baidu.com] # 搜索的域名范围(爬虫的约束区域)规定爬虫只爬取这个域名下的网页不存 在的URL会被忽略 start_urls [https://www.baidu.com] # 爬取的URL元组/列表。爬虫从这里开始抓取数据 ​ def parse(self, response): # 解析方法每个初始URL完成下载后将被调用 # 这里写解析代码 pass运行spider脚本# 在spider目录下运行 添加-o file指定保存路径 scrapy crawl spider_name

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询