分类 Python 下的文章

Python文件写入error


问题描述:

测试requests库,抓了一张百度的logo,在文件写入的时候报了权限不够的错
import requests
response = requests.get('https://www.baidu.com/img/bd_logo1.png')
print(response.content)
with open('C:/baidu.png', 'wb') as f:
    f.write(response.content)
    f.close()
Traceback (most recent call last):
  File "D:/PycharmProjects/untitled/test.py", line 42, in <module>
    with open('C:/baidu.png', 'wb') as f:
PermissionError: [Errno 13] Permission denied: 'C:/baidu.png'
解决方法:
  • 在当前项目下保存
with open('baidu.png', 'wb') as f:
    f.write(response.content)
    f.close()
  • 在非系统盘下保存
with open('D:/baidu.png', 'wb') as f:
    f.write(response.content)
    f.close()
  • ubuntu系统中给文件夹开放权限

Python selenium踩坑记


PyCharm抛出的错误(完整):
Traceback (most recent call last):
  File "D:/PycharmProjects/untitled/test.py", line 11, in <module>
    driver = webdriver.Chrome(executable_path=driver_path)
  File "C:\Users\19353\Anaconda3\envs\untitled\lib\site-packages\selenium\webdriver\chrome\webdriver.py", line 81, in __init__
    desired_capabilities=desired_capabilities)
  File "C:\Users\19353\Anaconda3\envs\untitled\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "C:\Users\19353\Anaconda3\envs\untitled\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "C:\Users\19353\Anaconda3\envs\untitled\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\19353\Anaconda3\envs\untitled\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 77
主要是这句:
This version of ChromeDriver only supports Chrome version 77
看出来没,意思是版本不支持

解决方法(chrome为例):
打开浏览器在地址栏输入:chrome://version/
得到浏览器的版本信息,如图例:

TIM图片20200110223355.png

查看版本对应的驱动:

点这查看!!!
TIM图片20200110223824.png

下载对应的驱动:

TIM图片20200110223938.png

解压后到一个文件夹里,记住文件夹路径,使用时如下图:
from selenium import webdriver

driver_path = r"D:\Software_installation_program\chromedriver\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path)
问题总结:
我最开始以为chromedriver.exe是通用的,版本越高越能适配,结果发现我想多了,凉凉~

仿图书检索系统第一弹Python(爬取数据)


制作缘由:

简单点说就是图书馆老师有一个项目,需要给一个公司讲什么东西,需要检索系统,但是数据来源却要自己从网上爬,因为账号很贵,不值当的再另购置一个账号,找到了一位学长来做,学长忙着考研(●'◡'●)所以就顺下来了,哈哈!开始我以为很简单的爬取点东西罢了,然后正真着手做的时候呵呵了~原因下篇博客中有讲 => 在此奉上链接~无奈之下想到了用Python自动化爬虫-->就是相当于挂一样,自己帮你操控浏览器来抓取数据~效率可想而知爬取较多的话,会有点慢(后话~~哭了┭┮﹏┭┮~)

所需Python的知识:

  • Selenium:

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器,但已经不再支持 PhantomJS了,一般使用chrome和firefox无界面浏览器。Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。具体了解请点这!!!
UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead
warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless '
安装:
pip install selenium
安装驱动程序
下面介绍几种主流浏览器的驱动程序下载地址:
浏览器下载地址
Chromehttps://sites.google.com/a/chromium.org/chromedriver/downloads
Edgehttps://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Firefoxhttps://github.com/mozilla/geckodriver/releases
Safarihttps://webkit.org/blog/6900/webdriver-support-in-safari-10/
我用的时windows系统,chrome浏览器,所以下载了chromedriver_win32,解压出来会有一个.exe可执行程序,将它的路径添加到系统的环境变量就OK了(其实也不需要,下边会说)
选择页面元素:
Selenium 的 WebDriver提供了各种方法来寻找元素,假设下面有一个表单输入框:
<input type="text" name="user-name" id="passwd-id" />
在命令中使用elements可以选取多个元素。
# 获取id标签值
element = driver.find_element_by_id("passwd-id")
# 获取name标签值
element = driver.find_element_by_name("user-name")
# 获取标签名值
element = driver.find_elements_by_tag_name("input")
# 也可以通过XPath来匹配    推荐使用
element = driver.find_element_by_xpath("//input[@id='passwd-id']")
简单使用:
from selenium import webdriver
from lxml import etree
from selenium.common.exceptions import TimeoutException

# 设置chromedriver的路径
driver_path = r"你的chromedriver.exe位置"

# 启用chromedriver(声明浏览器对象)
driver = webdriver.Chrome(executable_path=driver_path)

#简单的先进入百度首页
driver.get('https://www.baidu.com/')
#设置打开浏览器的宽高
driver.set_window_size(1500, 1000)

# 页面缓冲时间(隐式等待)怕网不好的时候加载慢,导致后续抓取网页代码不全-->属于笨方法,不智能
driver.implicitly_wait(3)

# 页面缓冲时间(显示等待-->智能),先try以下,不行就等等再try
try:
    element = WebDriverWait(driver, 5).until(
        EC.presence_of_element_located((By.ID, 'kwssss'))
    )
    print(element)
except TimeoutException as ex:
    print(ex)
#抓取网页源码
html = etree.HTML(driver.page_source)
# 百度测试   抓取输入框,send_keys是在input里输入内容然后等待三秒钟再清空
# inputTag = driver.find_element_by_id('kw')
# inputTag = driver.find_element_by_name('wd')
# inputTag = driver.find_element_by_class_name('s_ipt')
inputTag = driver.find_element(By.ID, 'kw')
inputTag.send_keys('python')
time.sleep(3)
inputTag.clear()
#也可以不清空,抓取搜索按钮,点击搜索实践
# submitBtn = driver.find_element(By.ID, 'su')
# submitBtn =driver.find_element_by_xpath("//*[@id='su']")
# submitBtn.click()
鼠标动作链:
# selenium行为链测试
inputTag = driver.find_element_by_id('kw')   #根据ID抓取元素
submitBtn = driver.find_element(By.ID, 'su')
actions = ActionChains(driver)   #调用行为连
actions.move_to_element(inputTag)   #将鼠标移动过去
actions.send_keys_to_element(inputTag, 'Python')   #向里面填数据
actions.move_to_element(submitBtn)    #鼠标移动到搜索按钮上
actions.click(submitBtn)   #点击
actions.perform()   #行为链启动,否则上边不执行
获取文本值:
#根据Xpath语法
html.xpath("Xpath路径/text()")
注意事项:
1、如果只是想要解析网页中的数据,那么推荐将网页源代码扔给lxml来解析,因为lxml底层使用的是C语言,所以解析效率会更高。
2、如果是想要对元素进行一些操作,比如给一个文本 框输入值,或者是点击某个按钮,那么必须使用selenium给我们提供的查找元素的方法。
常见的表单元素:input type = 'text/password/email/number'button、input[type = 'submit']chexbox:input = 'chexbox'select;下拉列表'''
未完待续......
git完整项目链接

召唤看板娘