上传网站到百度,正能量erp软件下载网站,汕头seo优化项目,宁波网页设计机构一. 爬虫的方式#xff1a;
主要有2种方式:
①ScrapyXpath (API 静态 爬取-直接post get)
②seleniumXpath (点击 动态 爬取-模拟)
ScrapyXpath
XPath 是 Scrapy 中常用的一种解析器#xff0c;可以帮助爬虫定位和提取 HTML 或 XML 文档中的数据。
Scrapy 中使用 …一. 爬虫的方式
主要有2种方式:
①ScrapyXpath (API 静态 爬取-直接post get)
②seleniumXpath (点击 动态 爬取-模拟)
ScrapyXpath
XPath 是 Scrapy 中常用的一种解析器可以帮助爬虫定位和提取 HTML 或 XML 文档中的数据。
Scrapy 中使用 XPath 的方式和普通的 Python 程序基本一致。我们需要首先导入 scrapy 的 Selector 类和 scrapy 的 Request 类然后使用 Selector 类来解析 Response 对象并使用 XPath 表达式来定位和提取数据。
详细讲解可以参考Scrapy爬虫学习笔记之二Xpath的用法 - 知乎
seleniumXpath
Selenium 是为了解决 requests 无法直接执行 JavaScript 代码的问题。本质是通过驱动浏览器完全模拟浏览器的操作输入、点击、下拉等。
安装pip install selenium
使用需要下载浏览器驱动并且驱动要跟浏览器版本对应
chrome浏览器版本在114之前
浏览器版本在114之前可以进入以下网址http://chromedriver.storage.googleapis.com/index.html直接下载相应的文件
chrome浏览器版本在115以上
以下版本皆为chromedriver版本
例如version : 119.0.6045.21你电脑的浏览器版本为其他版本如118.0.5952.2只需要把链接中的版本号替换成这个编号即可
平台下载地址linux64http:// https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/119.0.6045.21/linux64/chromedriver-linux64.zipmac-arm64https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/119.0.6045.21/mac-arm64/chromedriver-mac-arm64.zipmac-x64https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/119.0.6045.21/mac-x64/chromedriver-mac-x64.zipwin32https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/119.0.6045.21/win32/chromedriver-win32.zipwin64https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/119.0.6045.21/win64/chromedriver-win64.zip
Chromedriver 插件安装教程
参考稳扎稳打学爬虫09—chromedriver下载与安装方法-CSDN博客
下面简单使用模拟百度搜索
import timefrom selenium import webdriverbro webdriver.Chrome(executable_path./chromedriver.exe) # 得到一个谷歌浏览器对象并指定使用那个驱动bro.implicitly_wait(5) # 隐士等待找一个控件如果控件没有加载出来就等待5S只需要写着一句以后所有控件都按照这个操作来bro.get(https://www.baidu.com) # 在地址栏里输入百度input_k bro.find_element_by_id(kw) # 找到百度输入框对应的控件input_k.send_keys(火灾火焰) # 框里面输入pythonsou bro.find_element_by_id(su) # 找到搜索按钮sou.click() # 点击搜索按钮time.sleep(3)bro.close() # 关闭浏览器selenium详细用法参考https://www.cnblogs.com/XiaoYang-sir/p/15173174.html
二. seleniumxpath
利用selenium获取元素定位方法爬取百度图片
通过定位获取完整爬取图片的超链接信息鼠标放置百度页面右键》检测 完整爬取代码
注释author is leilei百度图片爬虫采用selenium模拟鼠标点击形式1. 将要搜索的文本表示成list2. 打开百度图片官网输入文本搜索3. 逐条下载对应的图片
注本代码支持断点续爬
import os
import uuid
import time
import random
import urllib
import urllib.request
from selenium import webdriver
from selenium.webdriver.common.keys import Keys # 键盘类#爬取的种类图片
NameList[火灾火焰, 火灾烟雾]def send_param_to_baidu(name, browser)::param name: str:param browser: webdriver.Chrome 实际应该是全局变量的:return: 将要输入的 关键字 输入百度图片# 采用id进行xpath选择id一般唯一inputs browser.find_element_by_xpath(//input[idkw])inputs.clear()inputs.send_keys(name)time.sleep(1)inputs.send_keys(Keys.ENTER)time.sleep(1)return
写Python爬虫的时候没过多久Python就会报错然后停止采集。总是没办法从头到尾把数据采集下来。
每一下次报错我都要去找原因比如我要采集的标签里面没有URLURL为空就会报错
或者页面没有URL也会报错。于是我是用try…except语句跳过错误但是还是会遇到其他问题
就是try…except语句只能跳过一次错误第二次错误就会失效。所以采用了下面这种mistaken方法处理异常。def mistaken():try:print(*****出现异常错误跳过此次循环爬取无内容*****)######采集代码##########print(——————————接下来继续运行——————————)except:mistaken()def download_baidu_images(save_path, img_num, browser): 此函数应在:param save_path: 下载路径 str:param img_num: 下载图片数量 int:param name: 爬取种类的名字:param browser: webdriver.Chrome:return:if not os.path.exists(save_path):os.makedirs(save_path)##下面是打开第一张图片然后在此界面中点击左右切换图片# // *[ id imgid]/div[1]/ul/li[1]/div/div[2]/a/img#如果这里报错其中下面这里的定位地址需要根据百度你爬取的图片的位置进行相应的修改img_link browser.find_element_by_xpath( //*[id imgid]/div[1]/ul/li[1]/div/div[2]/a/img)img_link.click()# 切换窗口windows browser.window_handlesbrowser.switch_to.window(windows[-1]) #切换到图像界面# time.sleep(3)time.sleep(random.random())for i in range(img_num):img_link_ browser.find_element_by_xpath(//div/img[classcurrentImg])src_link img_link_.get_attribute(src)print(src_link)# 保存图片使用urlibimg_name uuid.uuid4()# urllib.request.urlretrieve(src_link, os.path.join(save_path, str(img_name) .jpg))# 上述一行代码直接去访问资源会报403错误排查发现可能是服务器开启了反爬虫针对这种情况添加headers浏览器头模拟人工访问网站行为opener urllib.request.build_opener()# 构建请求头列表每次随机选择一个ua_list [Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.62,Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0,Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0]opener.addheaders [(User-Agent, random.choice(ua_list))]urllib.request.install_opener(opener)#为了不中断程序完整爬取所以处理爬虫的过程中出现资源请求不到的错误404 或者403的错误只需要跳过这些错误继续执行try:urllib.request.urlretrieve(src_link, os.path.join(save_path, str(img_name) .jpg))except Exception as e:print(e)mistaken()# 如果网站反爬虫级别特别高的还需要切换代理ip使用urllib模块设置代理IP是比较简单的首先需要创建ProxyHandler对象其参数为字典类型的代理IP键名为协议类型如HTTP或者HTTPS)值为代理链接。然后利用ProxyHandler对象与buildopener()# 方法构建一个新的opener对象最后再发送网络请求即可。# 创建代理IP# proxy_handler urllib.request.ProxyHandler({# https: 58.220.95.114:10053# })# # 创建opener对象# opener urllib.request.build_opener(proxy_handler)# 关闭图像界面并切换到外观界面time.sleep(random.random())# 点击下一张图片browser.find_element_by_xpath(//span[classimg-next]).click()time.sleep(random.random())# 关闭当前窗口并选择之前的窗口browser.close()browser.switch_to.window(windows[0])returndef main(names, save_root, img_num[1000, ], continue_num0, is_open_chromeTrue)::param names: list str:param save_root: str:param img_num: int list or int:param continue_num: int 断点续爬开始索引,从哪一个种类继续爬取:param is_open_chrome: 爬虫是否打开浏览器爬取图像 bool defaultFalse:return:options webdriver.ChromeOptions()# 设置是否打开浏览器if not is_open_chrome:options.add_argument(--headless) # 不打开浏览器# else:# prefs {profile.managed_default_content_settings.images: 2} # 禁止图像加载# options.add_experimental_option(prefs, prefs)# 欺骗反爬虫浏览器可以打开但是没有内容options.add_argument(--disable-blink-featuresAutomationControlled)browser webdriver.Chrome(executable_pathrD:\Anconda\envs\temp\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe,optionsoptions)browser.maximize_window()browser.get(rhttps://image.baidu.com/)time.sleep(random.random())assert type(names) list, names参数必须是字符串列表assert continue_num len(names), 中断续爬点需要小于爬虫任务数量if type(img_num) int:img_num [img_num] * len(names)print(img_num)elif type(img_num) list:print(lsit:{}.format(img_num))else:print(None, img_num 必须是int list or int)returnfor i in range(continue_num, len(names)):name names[i]save_path os.path.join(save_root, str(names.index(name))) # 以索引作为文件夹名称send_param_to_baidu(name, browser)download_baidu_images(save_pathsave_path, img_numimg_num[i],browserbrowser)# 全部关闭browser.quit()returnif __name__ __main__:main(namesNameList,save_rootrC:\Users\HUAWEI\Desktop\photo,img_num[1000, 1000],continue_num1)
具体selenium的动态定位法
参考链接 https://blog.csdn.net/u012206617/article/details/132451577?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-132451577-blog-109838581.235^v40^pc_relevant_anti_vipspm1001.2101.3001.4242.1utm_relevant_index3 三. ScrapyXpath 需要使用 icrawler 包 [ps:直接pip install icrawler]
完整的代码1
import os
from icrawler.builtin import BaiduImageCrawler
from icrawler.builtin import BingImageCrawler#可以使用,使用icrawler包静态爬取图片def check_path(path):if not os.path.exists(path):os.makedirs(path)return pathdef baidu_bing_crwal(key_words[中国人], max_nums[1000], save_rootr./):#看是否存在文件夹check_path(save_root)assert len(key_words)len(max_nums), 关键词和数量必须一致# 2个一起爬虫save_root1 os.path.join(save_root, baidu)# 百度爬虫for i in range(len(key_words)):print(-*20)image_save_root os.path.join(save_root1, str(i))if not os.path.exists(image_save_root):os.makedirs(image_save_root)storage {root_dir: image_save_root}crawler BaiduImageCrawler(storagestorage)crawler.crawl(key_words[i], max_nummax_nums[i])# bing爬虫save_root2 os.path.join(save_root, bing)for i in range(len(key_words)):print(-*20)image_save_root os.path.join(save_root2, str(i))if not os.path.exists(image_save_root):os.makedirs(image_save_root)storage {root_dir: image_save_root}crawler BingImageCrawler(storagestorage)crawler.crawl(key_words[i], max_nummax_nums[i])returnif __name__ __main__:# baidu_bing_crwal(key_words[生活垃圾, 化学垃圾,],# max_nums[1000, 1000],# save_rootrC:\Users\HUAWEI\Desktop\photo\da)baidu_bing_crwal(key_words[火灾火焰, 火灾烟雾],max_nums[1000, 1000],save_rootrC:\Users\HUAWEI\Desktop\photo\da) 其实简化的静态爬虫方式
完整的代码2
底层肯定是scrapy静态报文谷歌引擎不可以百度最快bing速度有点慢直接pip install icrawler若想搜索多个关键词可以遍历for循环同时icrawler也可对图像链接list、txt直接遍历UrlListCrawlerfrom icrawler.builtin import GoogleImageCrawler
from icrawler.builtin import BaiduImageCrawler
from icrawler.builtin import BingImageCrawler# storage字典格式root_dir: 保存路径
# crawler BaiduImageCrawler(storage{root_dir: rD:\temp\dog})
crawler BaiduImageCrawler(storage{root_dir: rC:\Users\HUAWEI\Desktop\photo})
crawler.crawl(keyword火焰, max_num10)
最后爬取图片的任务完成了 ☺☺☺
学习参考链接python 爬虫_python爬虫断点续爬-CSDN博客 稳扎稳打学爬虫09—chromedriver下载与安装方法-CSDN博客
爬虫selenium获取百度任意图片_img_link browser.find_elements_by_xpath(//li/di-CSDN博客Python爬虫爬取百度图片selenium模拟登录详细注释_百度图片 爬虫 find_elements-CSDN博客
爬虫selenium获取元素定位方法总结动态获取元素_selenium如何定位动态元素-CSDN博客