入门案例
通过入门案例快速入门
import requests
url = 'http://www.cntour.cn/'
strhtml = requests.get(url)
print(strhtml.text)
# --------------------------------------------------------------------
import requests
import json
def get_translate_data(word=None):
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
from_data = {
'i': word,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15901113472280',
'sign': '60347cb39956684398343a7720b9b80e',
'ts': '1590111347228',
'bv': 'd17d9dd026a611df0315b4863363408c',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'
}
# ip池
proxies = {
'http': 'http:10//10.10.1.10:3128',
'https': 'http:10.10.1.10:1080',
}
# 请求表单数据
response = requests.post(url, data=from_data, headers=headers, proxies=proxies)
# 将json格式字符串转换为字典
content = json.loads(response.text)
print(content)
# 打印翻译后的数据
print(content['translateResult'][0][0]['tgt'])
if __name__=='__main__':
get_translate_data('你好')
-# ----------------------------------------------------------------
import requests
# 调用BeautifulSoup
from bs4 import BeautifulSoup
import re
url = 'http://www.cntour.cn'
# 发送请求
str_html = requests.get(url)
# str_html.text为html Unicode文本,使用lxml解析器来解析
soup = BeautifulSoup(str_html.text, 'lxml')
data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.leftBox > div:nth-child(3) > ul > li > a')
print(data)
for item in data:
result = {
'title': item.get_text(),
'link': item.get('href'),
'id': re.findall('\d+', item.get('href'))
}
print(result)import requests
url = 'http://www.cntour.cn/'
strhtml = requests.get(url)
print(strhtml.text)
# --------------------------------------------------------------------
import requests
import json
def get_translate_data(word=None):
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
from_data = {
'i': word,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15901113472280',
'sign': '60347cb39956684398343a7720b9b80e',
'ts': '1590111347228',
'bv': 'd17d9dd026a611df0315b4863363408c',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'
}
# ip池
proxies = {
'http': 'http:10//10.10.1.10:3128',
'https': 'http:10.10.1.10:1080',
}
# 请求表单数据
response = requests.post(url, data=from_data, headers=headers, proxies=proxies)
# 将json格式字符串转换为字典
content = json.loads(response.text)
print(content)
# 打印翻译后的数据
print(content['translateResult'][0][0]['tgt'])
if __name__=='__main__':
get_translate_data('你好')
# --------------------------------------------------------------------
import requests
# 调用BeautifulSoup
from bs4 import BeautifulSoup
import re
url = 'http://www.cntour.cn'
# 发送请求
str_html = requests.get(url)
# str_html.text为html Unicode文本,使用lxml解析器来解析
soup = BeautifulSoup(str_html.text, 'lxml')
data = soup.select('#main > div > div.mtop.firstMod.clearfix > div.leftBox > div:nth-child(3) > ul > li > a')
print(data)
for item in data:
result = {
'title': item.get_text(),
'link': item.get('href'),
'id': re.findall('\d+', item.get('href'))
}
print(result)
URI和URL
URI既是统一资源标志符,URL是统一资源定位符,URL是URI的子集。URI还有一个子集叫做URN,既统一资源名称。下图为URI,URL,URN的关系。
HTTP和HTTPS
HTTP协议是用于从网络传输超文本数据到本地浏览器的传送协议,它能保证高效准确地传输超文本文档。HTTPS是HTTP的安全版,即HTTP下加入了SSL层,简称HTTPS。
谷歌浏览器开发者模式
- network下各属性的含义
以下显示的是每一个请求。
- 第一列 Name:请求的名称,一般会将 URL 的最后一部分内容当作名称。
- 第二列 Status:响应的状态码,这里显示为 200,代表响应是正常的。 通过状态码,我们可
以判断发送了请求之后是杏得到了正常的响应。 - 第三列 Type: 请求的文梢类型。 这里为document,代表我们这次请求的是一个HTML文档, 内容就是一些 HTML代码。
- 第四列 Initiator: 请求源。用来标记请求是由哪个对象或进程发起的。
- 第五列 Size: 从服务器下载的文件和请求的资源大小。 如果是从缓存中取得的资源,则该列会显示from cache。
- 第六列 Time: 发起请求到获取响应所用的总时间。
- 第七列Waterfall:网络请求的可视化瀑布流。
点开请求查看详细的信息。
首先是 General 部分:
- Request URL 为请求的 URL
- Request Method 为请求的方法
- Status Code 为响应状态码
- Remote Address 为远程服务器的地址和端口
- Referrer Policy 为 Referrer判别策略
Response Headers 和 Request Headers,这分别代表响应头和请求头。
Request Headers
- Accept:请求报头域,用于指定客户端可接受哪些类型的信息。
- Accept-Language:指定客户端可接受的语言类型。
- Accept-Encoding :指定客户端可接受的内容编码。
- Host:用于指定请求资源的主机 IP 和端口号,其内容为请求 URL 的原始服务器或网关的位 置。 从 HTTP 1. l
版本开始,请求必须包含此内容。 - Cookie :也常用复数形式 Cookies,这是网站为了辨别用户进行会话跟踪而存储在用户本地 的数据。
它的主要功能是维持当前访问会话。 例如,我们输入用户名和密码成功登录某个网
站后,服务器会用会话保存登录状态信息,后面我们每次刷新或请求该站点的其他页面时, 会发现都是登录状态,这就是 Cookies 的功劳。
Cookies 里有信息标识了我们所对应的服务器 的会话,每次浏览器在请求该站点的页面时,都会在请求头中加上 Cookies
并将其发送给服 务器,服务器通过 Cookies 识别出是我们自己,并且查出当前状态是登录状态,所以返回结
果就是登录之后才能看到的网页内容。 - Referer:此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相 应的处理,如做来源统计、防盗链处理等。
- User-Agent:简称 UA,它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统 及版本、 浏览器及版本等信息。
在做爬虫时加上此信息,可以伪装为浏览器;如果不加,很 可能会被识别州为爬虫。 - Content-Type:也叫互联网媒体类型( Internet Media Type )或者 MIME 类型,在 HTTP 协议
消息头中,它用来表示具体请求中的媒体类型信息。 例如, text/html 代表 HTML 格式, image/gif代表 GIF
图片, application/json 代表 JSON类型,更多对应关系可以查看此对照表:
http://tool.oschina.neνcommons。
Response Headers
- Date: 标识响应产生的时间。
- Last-Modified : 指定资源的最后修改时间。
- Content-Encoding : 指定响应内容的编码。
- Server: 包含服务器的信息 ,比如名称、版本号等。
- Content-Type: 文档类型,指定返回的数据类型是什么 ,如 text/html 代表返回 HTML 文档,
application/x-javascript !J!U代表返回 JavaScript 文件, image/jpg 则代表返回图片。 - Set-Cookie : 设置 Cookies。 响应头中的 Set-Cookie 告诉浏览器需要将此内容放在 Cookies 中 ,
下次请求携带 Cookies 请求。 - Expires: 指定响应的过期时间 , 可以使代理服务器或浏览器将加载的内容更新到缓存巾。 如 果再次访问时,就可以直接从缓存中加载,
降低服务器负载,缩短加载时间。
爬虫概述
- 获取页面
使用requests,urllib等python库,实现HTTP请求的操作,得到响应之后,只需要解析数据结构中的Body部分即可,即得到网页的源代码。HTTP请求库只能获取HTML的信息,对于JavaScript渲染页面的网页要使用Selenium, Splash这样的库来实现模拟JavaScript渲染。
- 提取信息
使用Beautiful Soup, pyquery, lxml等python库,这些库可以更具网页节点属性,CSS选择器或者XPath来提取网页信息。
- 保存数据
把提取到的信息保存在类如TXT文本或JSON数据当中,也可以保存在MySQL和MongoDB数据库当中。
- 自动化程序
代替人工的自动化程序,在抓取过程中进行各种异常吹,错误重试等操作,保证爬取持续高效地运行。