Python3爬虫之一
介绍:几乎每一个网站都有一个名为robot.txt文档,对于没有设定robot.txt文档 的网站可以通过网络爬虫获取没有口令加密的数据(即该网页的数据都可以爬取),对于有robot.txt文档的网站就要去判断是否有禁止访客获取的数据。
出现上面的代码时,表示除前面指定的爬虫外,不允许其他爬虫取任何数据。
如:https://www.taobao.com/robot.txt
爬虫原理:
(1)网页请求过程:
request(请求):用户向服务器发送请求
response(响应):服务器发送内容给用户。
(2)网页请求方式:
GET:一般用于获取或者查询资源信息(响应速度比较快)
POST:多以表单形式上传参数的功能,除查询数据外,还可以修改信息。
注:爬虫前要先确定向谁发送请求,用什么方式发送。
-
1、使用GET方式抓取数据
复制任意一条首页首条新闻标题,在源码页面按 Ctr+f调出搜索框,将标题粘贴在搜索框中,然后按Enter键。
比如:请求对象是www.cotour.cn,请求方式是GET如下图所示:
确定好请求对象后,在Pycharm中输入下面代码:
import requests #导入requests包
url=‘http://www.cntour.cn/’
strhtml=requests.get(url) #GET方式,获取网页数据
print(strhtml.text)
运行即可!!!!!
注释:
‘’’
requests.get
strhtml=requests.get(url)
将获取的数据存到strhtml变量中
这时候,strhtml是一个URL对象,它代表整个网页,但此时只需要网页中的源码,下面语句表示网页的源码
strhtml.text
‘’’ -
2、使用POST方式抓取数据
首先打开有道翻译的网址:http://www.fanyi.youdao.com/,
进入有道翻译页面,按F12,进入开发者模式,单击Network,此时内容为空。(注:F12开发人员工具是一套按需采用的工具,网站开发人员可以随时在任何网页上使用F12工具,从而快速调试的JavaScript中,HTML和级联样式表(CSS),还可以跟踪并查明网页或网络的性能问题。部分电脑打开F12是需要组合键:FN + F12。)
这中间遇到一点问题:f12快捷键打不开开发者模式,win10的系统问题还未解
附上:POST抓取数据的代码。这是一有道翻译为例子的,在页面中输入我爱中国按下翻译;在开发者模式中。。。。。
import requests
import json
def get_translate_date(word=None):
url=‘http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule’
From_data={‘i’:word,‘form’:‘AUTO’,‘to’:‘AUTO’,‘smartresult’:‘dict’,‘client’:‘fanyideskweb’,
‘salt’:‘1512399450582’,‘sign’:‘78181ebbdcb38de9b4aa3f4cd1d38816b’,‘doctype’:‘json’,
‘version’:‘2.1’,‘keyfrom’:‘fanyi.web’,‘action’:‘EY_BY_CLICKBUTTION’,‘typoResult’:‘false’}
#请求表单数据
response = requests.post(url,data=payload)
#将JSON格式字符串转为字典
content = json.loads(response.text)
#打印翻译后的数据
print(connect[‘translateResult’][0][0][‘tgt’])
if name==‘main’:
get_translate_data(‘我爱中国’)
使用Beautiful Soup解析网页
通过requests库已经可以抓取源码,接下来就是从源码中找到并提取数据。Beautiful Soup目前已经被移植到bs4库中(所以在导入Beautiful Soup时需要先安装bs4库)。
安装好bs4库之后,就需要安装lxml库,如果不安装就会使用Python默认的解析器。
安装Python第三方库之后需要输入以下代码,就可以开启Beautiful Soup之旅。
import requests
from bs4 import BeautifulSoup
#固定格式
url=‘http://www.cntour.cn/’
strhml=requests.get(url)
#内容
soup=BeautifulSoup(strhml.text,‘lxml’)
data=soup.select(’#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a’)
print(data)
#固定格式
注:首先,HTML文档被转换成Unicode编码格式,然后Beautiful Soup现在最合适的解析器来解析这段文档,此处制定lxml解析器进行解析。解析后便将复杂的HTML文档换成树形结构,并且每一个节点都是Python对象。
这里将解析器的文档存储到新建的变量soup中,代码如下:
soup=BeautifulSoup(strhml.text,‘lxml’)
接下来选择select(选择器)定位数据,定位的数据需要使用浏览器的开发者模式,并将鼠标的光标停在对应的数据位置并右击,然后选择“检查”命令,
随后在浏览器右侧会提出开发者页面,右侧高亮的代码对应左侧高亮的数据文本。右击右侧高亮的数据,在弹出的快捷菜单中选择Copy->Copy Selector命令,便可以自动复制路径。
将路径粘贴在文档中,代码如下:
(’#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li:nth-child(1)>a’)由于这条路径是选中的第一条的路径,而我们需要获取所有的头条新闻,因此将li:nth-child(1)中的:及后面部分去掉。代码如下
(’#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a’)。