python Web抓取(一)[没写完]

时间:2021-10-03 00:29:18

需要的模块:

  python web抓取通过:

    webbrowser:是python自带的,打开浏览器获取指定页面

    requests:从因特网上下载文件和网页

    Beautiful Soup:解析HTML

    Selenium:启动并控制一个Web浏览器。selenium能够填写表单,并模拟鼠标在这个浏览器中点击   >>>这个在这里

一、项目:利用Webbrowser模块的快速翻译脚本

   webbrowser.open(url) 会在默认浏览器中打开这个地址  

>>> import webbrowser
>>> webbrowser.open('http://wx3.sinaimg.cn/mw600/796df69bgy1g0ufuql7mdj20tp0x8dmc.jpg') #将打开这个地址
True

  这大概就是 webbrowser 模块能做的唯一的事情。但利用 webbrowser.open() 并配合其他知识,可以让一些事情更简便的完成。

  打算做个脚本:把剪贴板上的英文词语自动在Google翻译中打开,只需要将单词拷贝到剪贴板,运行脚本,浏览器会打开一个新标签页,显示翻译结果

程序需要做到:

  从命令行参数或剪贴板中取得单词、

  打开Web浏览器,指向该单词的Google翻译

即代码需要完成的工作:

  从 sys.argv 读取命令行参数

  读取剪贴板内容

  调用 webbrowser.open() 函数打开外部浏览器

  使用命令行参数  >>>参见<<<

全部代码:

#! python3
# mapIt.py - 将地址拷贝到剪贴板,运行这个脚本,就会打开goole地图中的地址页面
#修改为翻译英文单词的功能
import webbrowser
import sys
import pyperclip#假如命令行没有提供参数就翻译剪贴板中的内容 url='https://translate.google.cn/?hl=zh-CN&tab=TT#view=home&op=translate&sl=en&tl=zh-CN&text='
if len(sys.argv)>1:
url=url+sys.argv[1]
else:
url=url+pyperclip.paste() print(url)
webbrowser.open(url)

  

1.1弄清楚URl

  首先你要弄清楚,对于指定的单词,要到底使用怎样的URl。你在浏览器中打开 http://translate.google.com/ 并查找一个单词时,地址栏中的URL看起来像这样

https://translate.google.cn/?hl=zh-CN&tab=TT#view=home&op=translate&sl=en&tl=zh-CN&text=cute

  其中cute是你想要查找的单词, sl=en&tl=zh-CN 代表你将英语翻译为汉语。其他的一些数据我猜想则是用来定制网站的。但如果我们尝试将 cute 替换为任何想翻译的英文词语,发现也是可以的即url为

https://translate.google.cn/?hl=zh-CN&tab=TT#view=home&op=translate&sl=en&tl=zh-CN&text=keyword  #keyworld是你要翻译的英文单词

1.2处理要处理的参数

  准备先取得命令行传递的参数去翻译,假如命令行没有传参数,就以剪贴板上的内容为准

if len(sys.argv)>1:   #来判断命令行的参数是否只有一个
url=url+sys.argv[1]
else:
url=url+pyperclip.paste()

1.3.批处理文件内容

@py.exe C:\Users\Administrator.SC-201605202132\AppData\Local\Programs\Python\Python37\mapIt.py %*
#假如这行写了@pasue的话运行程序后cmd窗口会不消失

待改进:

  可以继续向命令行传入参数来指定更多的翻译方式

  可以将返回值取回来显示在cmd窗口中、或者过段时间就关闭打开的界面

大佬的想法:>>>详细信息<<<

二、用requests模块从Web下载文件

   requests 模块让你很容易从Web下载文件,不必担心网络错误、连接问题和数据压缩。这比 urllib2 模块要更方便使用

2.1安装 requests 模块  >>>详细信息<<<<

  命令行运行:

pip install requests

2.2用requests模块下载一个网页

  使用 requestes.get(url) 接受一个要下载的URL字符串会返回一个Response对象,其中包含了Web服务器对你的请求作出的响应。通过检查ResPonse对象的 status_code (状态码)属性,我们可以确认对这个URL的请求是否成功,如果该值等于 resquests.codes.ok 就说明成功了

>>> import requests
>>> res=requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
>>> type(res)
<class 'requests.models.Response'>
>>> res.status_code==requests.codes.ok
True
>>> len(res.text) #注意这里是text不是txt
178981
>>>
>>> print(res.text[:100])
The Project Gutenberg EBook of Romeo and Juliet, by William Shakespeare This eBook is for the us

  也可以用来请求一个普通的地址,但似乎还没想到有什么用,或许能用来取得上面翻译的内容然后在本地显示?

2.2检查错误

  我们可以通过判断 requests.codes.ok 值与Response对象的 status_code 属性值是否相等来了解下载是否成功。检查成功还有另外一种更简单的办法,就是在Response对象上调用 raise_for_status() 方法。如果下载出错,就会抛出异常。如果下载成功就什么也不做。

>>> res=requests.get('http://inventwithpython.com/page_that_does_not_exist')
>>> res.raise_for_status()
Traceback (most recent call last):
File "<pyshell#30>", line 1, in <module>
res.raise_for_status()
File "C:\Users\Administrator.SC-201605202132\AppData\Local\Programs\Python\Python37\lib\site-packages\requests\models.py", line 940, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: http://inventwithpython.com/page_that_does_not_exist
>>>

   raise_for_status() 方法是一种很好的方式,来帮助我们确认下载是否成功,当我们的程序应该在下载出错是停止,这就是一个好方法,假如下载出错后可以继续运行,我们就可以使用 try..except 语句把它包裹起来,处理这一错误,不让程序崩溃

import requests
res=requests.get('http://inventwithpython.com/page_that_does_not_exist')
try:
res.raise_for_status()
except Exception as exc:
print('这里出现了一个错误:'+str(exc)

  

三、将下载的文件保存到硬盘

  一旦网页被下载了后,他就是我们程序中的数据我们可以使用标准的 open() 与 write() 方法来将web页面保存到计算机本地,但要注意,需要以“写二进制”模式打开文件,即向函数传入字符串 'wb' ,代替更常被使用的'a'、'w'、'r'。以此写入二进制数据,这是为了保存文本中的“Unicode编码”。

  Unicode是为每种语言中的符号和文字都制定一种独特的编码,这个标准让让计算机实现跨语言、跨平台的文字转换及处理,关于Unicode编码的更多信息,你可以点击: >>>了解更多<<<

  

import requests

res=requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
res.raise_for_status()
playFile=open('RomeoAndJuliet.txt','wb')  #这会在你电脑上创建一个名为RomeoAndJuliet的文本文件
for chunk in res.iter_counter(100000): playFile.write(chunk) playFile.close()

  

  Response对象的 iter_counter(size) 方法每次回返回一段内容,每一段都是bytes数据类型,你需要指定size的大小,通常100000是一个不错的选择,配合for循环来使用,这保证了 requests 模块在下载巨大的文件时也不会占用太多内存

回顾一下从下载到保存文件的全过程:

  调用 requests.get(url) 下载文件

  用 'wb' 调用 open() ,以写二进制打开一个新文件

  利用Response的 iter_content() 方法来分段获得部分大小

  利用文件对象的 write() 方法写入

  关闭文件对象

四、用BeautifulSoup模块解析HTML

  当使用 requests.get() 获得HTML网页文件后,可以通过 Beautiful Soup 模块中的一些方法帮助我们从网页中找到自己所需要的信息。

   Beautiful Soup  是一个模块,用于从HTML页面中提取信息, Beautiful Soup  模块的名称是bs4.

安装:

  命令行运行

pip install beautifulsoup4

  导入 

import bs4

  要注意名称的不同

4.1从HTML创建一个BeautifulSoup对象

   bs4.BeautifulSoup() 函数调用需要一个字符串,其中包含要解析的HTML。 bs4.BeautifulSoup() 函数返回一个 BeautifulSoup 对象。

>>> import bs4
>>> import requests
>>> res=requests.get('http://baidu.com')
>>> res.raise_for_status()
>>> noStartSoup=bs4.BeautifulSoup(res.text)#注意传入的参数是res.text,并且是返回一个对象
>>> type(noStartSoup)
<class 'bs4.BeautifulSoup'>

  这个这个传入的参数也可以是一个File对象,可以从硬盘加载一个HTML文件。

>>> exampleFile=open('example.html')
>>> exampleSoup=bs4.BeautifulSoup(exampleFile)
>>> type(exampleSoup)
<class 'bs4.BeautifulSoup'>
>>>

  有了 BeautifulSoup 对象以后,就可以利用对象方法,来定位HTML文档中特定的部分。

4.2用select()方法寻找元素

   select() 接受一个css选择器字符串来返回一个标签对象的列表,(这个标签是 BeautifulSoup 表示一个HTML元素的方式);标签值可以传给 str() 函数,显示他们代表的HTML标签;标签值还有 getText() 方法和 attr 属性,前者返回该元素的文本或内部的HTML,后者返回一个字典,包含这个HTML元素的所有HTML属性

  

  常见的一些css选择器

传递给select()方法的选择器 将匹配。。。
soup.select('div') 所有名为<div>的元素
soup.select('#author') 所有id为author的元素
soup.select('.notice') 所有类名为notice的元素
soup.select('div span') 所有<div>中的<span>元素
soup.select('div > span) 所有直接在<div>内的<span>元素,中间没有其他元素
soup.select('input[name]) 所有名为<input>,并有一个name属性,其值无所谓的元素
soup.select('input[type="button"]) 所有名为<input>,并有一个type属性,其值为button的元素

  

>>> exampleFile=open('example.html')
>>> exampleSoup=bs4.BeautifulSoup(exampleFile)
>>> type(exampleSoup)
<class 'bs4.BeautifulSoup'>
>>> elems=exampleSoup.select('#author')
>>> type(elems)#返回值是一个列表
<class 'list'>
>>> len(elems)#匹配的个数
1
>>> elems[0].getText()#列表其中一个值得getText()方法,返回该元素的文本
'Al Sweigart' >>> str(elems[0])#标签值传递给str()方法,返回这个HTML标签 '<span id="author">Al Sweigart</span>'
>>> elems[0].attrs#标签值的attrs属性,返回标签值的所有HTML属性,是一个字典 {'id': 'author'}

  返回的是一个列表,比如寻找p元素,主义里面的比较

>>> elems=exampleSoup.select('p')
>>> type(elems)
<class 'list'>
>>> len(elems) #返回所有的匹配对象
3
>>> elems[0].getText()
'\nDownload my Pythonbook from\nmy website.\n' >>> elems[1].getText()
'Learn Python the easy way!'
>>> elems[1].attrs#注意这里,与下面对比,你可能就会更加清楚“HTML属性”指的是什么
{'class': ['slogan']}
>>> elems[0].attrs#注意
{}
>>> str(elems[1])
'<p class="slogan">Learn Python the easy way!</p>'
>>> str(elems[0])
'<p>\nDownload my <strong>Python</strong>book from\n<a href="http://inventwithpython.com">my website</a>.\n</p>'

4.3取得元素的属性数据

  标签对象(注意在返回的列表里)的 get() 方法让我们很容易从元素中获取属性值。向该方法传入一个属性名称的字符串,它将返回该属性的值

>>> import bs4
>>> exampleFile.close()
>>> exampleSoup=bs4.BeautifulSoup(open('example.html'))
>>> spanElem=exampleSoup.select('span')[0]
>>> str(spanElem)
'<span id="author">Al Sweigart</span>'
>>> spanElem.get('id')#返回Id属性的值
'author'
>>> spanElem.get('some_noneexitstent_addr')==None#因为没有这个属性名称,所以结果为None
True
>>> spanElem.attrs
{'id': 'author'}
>>>

python Web抓取(一)[没写完]的更多相关文章

  1. python Web抓取(二)selenium模块的使用、对浏览器的按键操作及错误处理

    建议以下帖子: 教你在Windows上搭建Python+Selenium环境:https://blog.csdn.net/huilan_same/article/details/52888262 py ...

  2. python自动化之web抓取

    ''' 从web抓取数据: webbrowser:是python自带的,打开浏览器获取指定页面. requests:从因特网上下载文件和网页. Beautiful Soup:解析HTML,即网页编写的 ...

  3. 如何用 Python 实现 Web 抓取?

    [编者按]本文作者为 Blog Bowl 联合创始人 Shaumik Daityari,主要介绍 Web 抓取技术的基本实现原理和方法.文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正 ...

  4. python 爬虫抓取心得

    quanwei9958 转自 python 爬虫抓取心得分享 urllib.quote('要编码的字符串') 如果你要在url请求里面放入中文,对相应的中文进行编码的话,可以用: urllib.quo ...

  5. python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 &lpar;前言&rpar;

    python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言) 感觉要总结总结了,希望这次能写个系列文章分享分享心得,和大神们交流交流,提升提升. 因为 ...

  6. python 处理抓取网页乱码

    python 处理抓取网页乱码问题一招鲜   相信用python的人一定在抓取网页时,被编码问题弄晕过一阵 前几天写了一个测试网页的小脚本,并查找是否包含指定的信息. 在html = urllib2. ...

  7. Python爬虫----抓取豆瓣电影Top250

    有了上次利用python爬虫抓取糗事百科的经验,这次自己动手写了个爬虫抓取豆瓣电影Top250的简要信息. 1.观察url 首先观察一下网址的结构 http://movie.douban.com/to ...

  8. Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储

    Python爬虫可以说是好玩又好用了.现想利用Python爬取网页股票数据保存到本地csv数据文件中,同时想把股票数据保存到MySQL数据库中.需求有了,剩下的就是实现了. 在开始之前,保证已经安装好 ...

  9. python数据抓取分析(python &plus; mongodb)

    分享点干货!!! Python数据抓取分析 编程模块:requests,lxml,pymongo,time,BeautifulSoup 首先获取所有产品的分类网址: def step(): try: ...

随机推荐

  1. ruby调试&sol;练习时的小技巧

    必备工具 irb 查祖先 1.9.3-p545 :023 > String.ancestors => [String, Comparable, Object, Kernel, BasicO ...

  2. 转一篇讲camera的 mb好多年不搞3d 都忘光了

    Camera定义 游戏中,Camera用来向用户展示场景,Camera就像一个摄像机,摄像机里面的景象就是Camera的展示范围,如下图所示: 在3D空间中Camera被定义为一个位置,有一个单位“方 ...

  3. 将数组转换成List

    采用比较好的方法Collections.addAll(arrayList, arr); arrayList是一个List arr是一个数组 并且要求arrayList与arr的类型是相同的  或    ...

  4. Linux usb子系统(一):子系统架构

    一.USB协议基础知识   前序:USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1.1版本速度12Mbps(全速USB)  USB2.0版本速度480Mbps(高速USB). ...

  5. 十大ios开发者喜爱的开源库

    十大ios开发者喜爱的开源库 (转自博客园) 2014-08-17 14:07:58|  分类: objective-c |  标签:ios  开源库  |举报|字号 订阅 下载LOFTER我的照片书 ...

  6. 位掩码&lpar;BitMask&rpar;的介绍与使用

    一.前言 位运算在我们实际开发中用得很少,主要原因还是它对于我们而言不好读.不好懂.也不好计算,如果不经常实践,很容易就生疏了.但实际上,位运算是一种很好的运算思想,它的优点自然是计算快,代码更少. ...

  7. 云笔记项目-笔记列表弹出&quot&semi;分享移动删除&quot&semi;子菜单

    业务需求: 笔记列表里还有一个按钮可以弹出子菜单,要求做到以下几点: (1)点击选中的笔记行的弹出按钮后,弹出子菜单,再次点击,子菜单收回. (2)选中其他笔记后,子菜单消失.效果如下图所示: 业务分 ...

  8. final阶段140字评论

    按课堂顺序 1约跑APP ,无论从页面还是从功能来看完整度都很高了.演示也用了能展示的方式.多些趣味性就更赞了. 2礼物挑选小工具,做了能在规定时间内的功能.也算是对礼物固话的一个成本最低的回应. 3 ...

  9. 微信小程序开发环境

    微信小程序开发环境 不忘初心,方得始终.初心易得,始终难守 小程序开发环境 开发工具下载地址:https://developers.weixin.qq.com/miniprogram/dev/devt ...

  10. Apache 调用不同的 PHP 版本

    # cd /etc/apache2/mods-enabled 建立 /etc/apache2/mods-available/ 之下的 php7.2.load   php7.2.conf 两个文件的符号 ...