网络基础
网络连接
客户端点开一个连接就会向服务器发送出一个请求,服务器就会向客户端返回相应的文件
爬虫原理
模拟浏览器对目标网站发送请求,然后从网站返回的数据中提取有用的数据,并将有用的数据存放于数据库或文件中。
- 简易爬虫:1)模拟计算器对服务器发起Request请求;2)接收服务器端的Response内容并解析、提取所需的信息3)存储数据(同视频课:reques(*robots.txt)协议-Beautiful Soup(解析html页面)-Re(正则表达式,提取页面关键信息+Scrapy框架))
- 多页面爬虫:1)学习各页面特点构建URL列表(页面有规律);2)循环遍历 URL列表,发起Request请求;3)解析提取数据;4)存储
- 跨页面爬虫:页面的URL不存在着明显规律的时候,就要考虑跨页面爬虫流程
页面结构
HTML各类标签+CSS+JS
开发者工具查看网页
Chrome的开发者模式为用户提供了下面几组工具。
- Elements:允许用户从浏览器的角度来观察网页,用户可以借此看到Chrome渲染页面所需要的HTML、CSS和DOM(Document Object Model)对象。
- Network:可以看到网页向服务气请求了哪些资源、资源的大小以及加载资源的相关信息。此外,还可以查看HTTP的请求头、返回内容等。
- 请求的每个资源在“Network”表格中显示为一行,对于某个特定的网络请求,可以进一步查看请求头、响应头及已经返回的内容等信息。对于需要填写并发送表单的网页而言(比如执行用户登录操作,以百度贴吧为例),在“Network”面板勾选“Preserve log”复选框,然后进行登录,就可以记录HTTP POST信息,查看发送的表单信息详情。之后在贴吧首页开启开发者工具后再登录时,就可以看到下图所示的信息,其中“Form Data”就包含向服务器发送的表单信息详情。
- Source:即源代码面板,主要用来调试JavaScript。
- Console:即控制台面板,可以显示各种警告与错误信息。在开发期间,可以使用控制台面板记录诊断信息,或者使用它作为shell在页面上与JavaScript交互。
- Performance:使用这个模块可以记录和查看网站生命周期内发生的各种事情来提高页面运行时的性能。
- Memory:这个面板可以提供比Performance更多的信息,比如跟踪内存泄漏。
- Application:检查加载的所有资源。
- Security:即安全面板,可以用来处理证书问题等。
另外,通过切换设备模式可以观察网页在不同设备上的显示效果,快捷键为:Ctrl + Shift + M(或者在 Mac上使用 Cmd + Shift + M)
HTTP协议
超文本传输协议
格式:url:http://host[:port][:path]
GET: URL位置资源
HEAD:URL资源头部信息
POST:向URL位置资源后附加新数据
PUT:向URL位置资源存储一个资源,覆盖之前
PATCH:请求局部更新URL资源
DELETE:删除URL存储的资源
Requests库
1主要方法
-
requests:构造请求
r=requests.get(url,params=None,**kwargs))
Request 对象 + Response对象(爬虫返回所有数据)
r.status_code:Http返回状态(200正常)
r.text:Http响应内容的字符串形式,url对应的页面内容
r.encoding: header中猜测的响应内容编码方式
r.apparent_encoding:分析出的响应内容编码方式
r.content:Http响应内容的二进制 -
get:获取html网页
-
head:获取网页头信息
-
post:提交post请求
-
put:提交put请求
-
patch:提交局部修改请求
-
delete:提交删除请求
-
(options)
2异常
- requests.ConnectionError:链接错误
- requests.HTTPError:Http错误
- requests.URLRequired:URL缺失异常
- requests.TooManyRedirects:超过最大重定向次数
- requests.ConnectTimeout:连接远程服务器超时
- requests.Timeout:请求url超时
- r.raise_for_status():Response判断访问状态
3异常
requests.request(method,url,**kwargs)
- method:请求方式,对应get/put/post等7种
- url:拟获取页面的url链接
- **kwargs:控制访问参数,共13个,均为可选项:
- params:字典或字节序列,作为参数增加到url中
例:kv={‘key1’:‘value’,‘key2’:‘value2’}
r=requests.request(‘GET’,‘http://python123.io/ws’,params=kv)
print(r.url) - data:字典,字节序列或文件对象,作为Request的内容
- json:JSON格式的数据,作为Request的内容
- headers:字典,HTTP定制头(模拟浏览器进行访问)
- cokies:字典或CpplieJar,Request中的cookie
- auth:元祖,支持HTTP认证功能
- files:字典类型,传输文件
- timeout:设定超时时间,秒为单位
- proxies:字典类型,设定访问代理服务器,可以增加登陆认证
- allow_redirects:True//False,默认为True,重定向开
- stream:True/False,默认为True,获取内容立即下载开关
- verify:True/False,默认为True,认证SSL证书开关
- cert:本地SSL证书路径
- params:字典或字节序列,作为参数增加到url中
Exercise
import requests
url = 'https://www.python.org/dev/peps/pep-0020/'
res = requests.get(url)
text = res.text
print(text)
with open('zon_of_python.txt', 'w') as f:
s=text[text.find('<pre')+28:text.find('</pre>')-1]
f.write(s)
print(s)
urllib是python3的标准库,包含了很多基本功能,比如向网络请求数据、处理cookie、自定义请求头等,使用略复杂;urllib整合了urllib、urllib2库,urllib3是第三方库
import urllib
url = 'https://www.python.org/dev/peps/pep-0020/'
res = urllib.request.urlopen(url).read().decode('utf-8')
print(res[res.find('<pre')+28:res.find('</pre>')-1])
试用金山翻译网站,处理上面爬取信息:
import requests
def translate(word):
url="http://fy.iciba.com/ajax.php?a=fy"
data={
'f': 'auto',
't': 'auto',
'w': word,
}
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
}
response = requests.post(url,data=data,headers=headers)
json_data=response.json()
return json_data
def run(word):
result = translate(word)['content']['out'] #获取翻译后信息,result通过分析json_data结构而来
print(result)
return result
def main():
with open('zon_of_python.txt') as f:
zh = [run(word) for word in f]
with open('zon_of_python_zh-CN.txt', 'w') as g:
for i in zh:
g.write(i + '\n')
if __name__ == '__main__':
main()
爬取豆瓣电影:
import requests
# https://movie.douban.com/
url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&page_limit=50&page_start=0'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
response = requests.get(url, headers=headers)
res = response.json()
print(res)
with open('movie.txt', 'w')as f:
for i in res['subjects']:
target = i['title']
target_pic = i['cover']
target_url = i['url']
f.write('movie:' + target + '; ' + 'poster:' + target_pic + '; ' + 'movie_url:' + target_url)
f.write('\n')
使用API
采集网络数据,并不一定必须从网页中抓取数据,而api(Application Programming Iterface)的用处就在这里:API为开发者提供了方便友好的接口,不同的开发者用不同的语言都能获取相同的数据。目前API一般会以XML(Extensible Markup Language,可拓展标记语言)或者JSON(JavaScript Object Notation)格式来返回服务器响应