需要:requests、bs4、BeautifulSoup、lxml、re、urllib
Python版本: Python3.7
运行平台: Windows
IED: pyCharm 2020.3
使用 requests 库请求网站
-
安装 requests 库
首先在 PyCharm 中安装 requests 库,为此打开 PyCharm,单击“File”(文件)菜单,选择“Setting for New Projects...”命令👇
文件 - 设置
选择“Project Interpreter”(项目编译器)命令,确认当前选择的编译器,然后单击左下角的加号
在搜索框输入:requests(注意,一定要输入完整,不然容易出错),然后单击左下角的“Install Package”(安装库)按钮👇。
输入requests,然后安装
安装完成后,会在 Install Package 上显示“Package‘requests’ installed successfully”(库的请求已成功安装)👇;如果安装不成功将会显示提示信息。
安装成功
最后记得点击【确定】按钮
最后记得点击【确定】按钮
- requests库的基础方法如下:
requests库的基础方法
官方中文教程地址:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
简单的网站抓取
-
使用 GET 方式抓取数据
新建python文件
目录结构
# hello.py文件
# 导入requests包
import requests
url = 'http://www.cntour.cn/'
strhtml = requests.get(url)
print(strhtml.text)
快捷键ctrl+shift+F10或者点击
绿色三角形,就会编译,编译结果如下
运行结果- 使用 POST 方式抓取数据【抓取有道翻译网站】
有道翻译的网址:http://fanyi.youdao.com/,进入有道翻译页面。
按快捷键 F12,进入开发者模式,单击 Network,此时内容为空,如下所示:
在有道翻译中输入“我爱中国”,单击“翻译”按钮,如下所示:
在开发者模式中,依次单击“Network”按钮和“XHR”按钮,找到翻译数据,如下所示:
单击 Headers,发现请求数据的方式为 POST。如图所示:
找到数据所在之处并且明确请求方式之后,接下来开始撰写爬虫。
首先,将 Headers 中的 URL 复制出来,并赋值给 url,代码如下:
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
POST 的请求获取数据的方式不同于 GET,POST 请求数据必须构建请求头才可以。
Form Data 中的请求参数如图所示,将其复制并构建一个新字典::
Form Data中的请求参数
Form_data = {
'i': '我爱中国',
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '16074811609507',
'sign': 'e637db0683139d97331fe7a370b6ca82',
'lts': '1607481160950',
'bv': '72f8a2699d04985331209000387bc6c3',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME',
'typoResult': 'false'
}
接下来使用 requests.post 方法请求表单数据,代码如下:
import requests #导入requests包
response = requests.post(url, data=Form_data)
将字符串格式的数据转换成 JSON 格式数据,并根据数据结构,提取数据,并将翻译结果打印出来,代码如下:
import json
content = json.loads(response.text)
print(content['translateResult'][0][0]['tgt'])
Beautiful Soup库
通过 requests 库已经可以抓到网页源码,接下来要从源码中找到并提取数据。Beautiful Soup 是 python 的一个库,其最主要的功能是从网页中抓取数据。Beautiful Soup 目前已经被移植到 bs4 库中,也就是说在导入 Beautiful Soup 时需要先安装 bs4 库。
安装bs4
lxml 库
安装好 bs4 库以后,还需安装 lxml 库。如果我们不安装 lxml 库,就会使用 Python 默认的解析器。尽管 Beautiful Soup 既支持 Python 标准库中的 HTML 解析器又支持一些第三方解析器,但是 lxml 库具有功能更加强大、速度更快的特点,因此推荐安装 lxml 库。
安装 lxml
安装 Python 第三方库后,输入下面的代码,即可开启 Beautiful Soup 之旅:
粘贴如下:
#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
使用 soup.select 引用这个路径,代码如下:
data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a')
完整代码和运行结果
清洗和组织数据
至此,获得了一段目标的 HTML 代码,但还没有把数据提取出来,接下来在 PyCharm 中输入以下代码:
for item in data:
result={
'title':item.get_text(),
'link':item.get('href')
}
print(result)
运行结果
从上图发现:文章的链接中有一个数字 ID。下面用正则表达式提取这个 ID。需要使用的正则符号如下:
- 【 \d 】匹配数字
- 【 + 】匹配前一个字符1次或多次
在 Python 中调用正则表达式时使用 re 库,这个库不用安装,可以直接调用。
import re
for item in data:
result={
"title":item.get_text(),
"link":item.get('href'),
'ID':re.findall('\d+',item.get('href'))
}
print(result)
# 完整代码
# 导入requests包
import requests
from bs4 import BeautifulSoup
import re
import time
# time.sleep(3)
url = 'http://www.cntour.cn/'
# 用 GET 方式获取数据; 将获取到的数据存到 strhtml 变量中
strhtml = requests.get(url)
# strhtml.text 表示网页源码
# print(strhtml.text)
# 首先,HTML 文档将被转换成 Unicode 编码格式,然后 Beautiful Soup 选择最合适的解析器来解析这段文档,此处指定 lxml 解析器进行解析。
# 解析后便将复杂的 HTML 文档转换成树形结构,并且每个节点都是 Python 对象。这里将解析后的文档存储到新建的变量 soup 中
soup = BeautifulSoup(strhtml.text, 'lxml')
data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li > a')
for item in data:
result = {
# 提取的数据是标题和链接,标题在<a>标签中,链接在<a>标签的 href 属性中
# 提取标签的正文用 get_text() 方法
# 提取标签中的 href 属性用 get() 方法,在括号中指定要提取的属性数据,即 get('href')。
'title': item.get_text(),
'link': item.get('href'),
'ID': re.findall('\d+', item.get('href'))
}
print(result)
# print(data)
完整代码和运行结果
findall ():第一个参数表示正则表达式,第二个参数表示要提取的文本。
服务器第一种识别爬虫的方式就是通过检查连接的 useragent 来识别到底是浏览器访问,还是代码访问的。如果是代码访问的话,访问量增大时,服务器会直接封掉来访 IP。服务器识别浏览器访问的方法就是判断 keyword 是否为 Request headers 下的 User-Agent.
User-Agent
网友评论