//本文是基于DataWhale教程的扩充和总结&学习心得,双斜杠后是脑洞和废话
//非完全原创
Chap1:互联网与HTTP
互联网
互联网(internet)是指网络与网络所串联成的庞大网络,这些网络以一组标准的网络协议族相连,连接全世界几十亿个设备,形成逻辑上的单一巨大国际网络。分为广域网、城域网、局域网。
因特网
当我们所说的是上文谈到的那个全球最大的也就是我们通常所使用的互联网络时,我们就称它为“因特网”(Internet)或称为“国际互联网”。因特网是互联网的一种。
万维网
万维网(WWW、World Wide Web、Web、3W)。WWW是基于客户机/服务器方式的信息发现技术和超文本技术的综合。 是互联网提供的服务之一。应用层使用了HTTP协议就称为万维网。
//大概类似于:互联网是火锅,因特网是提起火锅时我们的第一反应——四川火锅,虽然四川火锅是火锅的一种,同时也是火锅中最大的一类(暂定),但并不是火锅的全部。而万维网则像火锅自助,是火锅提供的服务之一(还有堂食火锅、速食火锅和外卖火锅)。
HTTP
HTTP是一个客户端(用户)和服务器端(网站)之间进行请求和应答的标准。客户端(即用户代理,user agent)通过浏览器、爬虫等,向服务器指定端口发起HTTP请求。应答服务器上存储着资源。User agent与origin server间可能还有中间层,如代理服务器、网关(网间连接器、协议转换器)、tunel(一种协议)等。
HTTP并没规定必须使用TCP/IP协议。
//大概就像固定的交易标准却不一定要有固定的合同文本吧,银货两讫就完事儿了
Chap2:网页基础
网页组成
总的来讲:HTML:骨 CSS:皮 JS:肉
这里记一下细节:标签闭合。值要用引号包裹。
和另一系列笔记内容重复了,略。
HTML DOM
文档、HTML元素、HTML元素内的文本、HEML属性、注释都是节点。构成了一个HTML DOM树。每个节点都可以被修改、创建、删除、通过JS访问。
css
开头表示按id选择,.是按class选择。css选择器支持嵌套选择,按从前往后的顺序依次筛选,中间隔空格(不加空格表示并列)
开发者工具
Elements:浏览器渲染页面所需要的HTML、CSS和DOM(Document Object Model)对象。
Network:可网页向服务器请求的资源、资源的大小以及加载资源的相关信息。此外,还可以查看HTTP的请求头、返回内容等。
Source:源代码面板,用来调试JavaScript。
Console:控制台面板,显示各种警告与错误信息。在开发期间,可以使用控制台面板记录诊断信息,或者使用它作为shell在页面上与JavaScript交互。
Performance:使用这个模块可以记录和查看网站生命周期内发生的各种事情来提高页面运行时的性能。
Memory:提供比Performance更多的信息,比如跟踪内存泄漏。
Application:检查加载的所有资源。
Security:即安全面板,可以用来处理证书问题等。
切换设备模式:Ctrl + Shift + M。
Chap3:requests.get
爬虫过程:访问站点,定位信息,得到信息
//访问饭店,定位我要的菜,得到我要的菜
练习一:爬取The zen of Python
import requests
url = 'https://www.python.org/dev/peps/pep-0020/'
res = requests.get(url)
text = res.text
text
得到element,通过审查元素知道文本被包裹在pre标签内
with open('zen_of_python.txt','w')as f:
f.write(text[text.find('<pre')+28:text.find('</pre>')-1])
print(text[text.find('<pre')+28:text.find('</pre>')-1])
#class="literal-block"> == &0一共28个字符
这段文本写得不错的,po一下
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
或者用urllib库
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])
Chap4:request.post
练习二:爬取iciba
通过审查元素找到POST数据
在XHR里,很好找
preview查看到content的out是翻译结果。
想要用爬虫自动获取翻译结果,就要模拟表单和user agent。让爬虫假装是浏览器,并提交正常的请求格式。
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',
}#User-Agent,让爬虫假装自己是浏览器
response = requests.post(url,data=data,headers=headers)
#发起请求
json_data=response.json()
#获取json数据
return json_data
def run(word):
result = translate(word)['content']['out']
#按索引找到翻译结果
print(result)
return result
def main():
with open('zen_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()
原始的json data是这样子的。
//有点震惊的,iciba居然不反爬
翻译效果还不错的,po一下
美丽胜过丑陋。
外显优于内隐..
简单胜于复杂。
复杂胜于复杂。
平比嵌套好..
疏而不密..
可读性计数。
特殊情况不足以打破规则。
尽管实用性胜过纯度。
错误永远不应该悄悄地过去。
除非有明确的沉默。
面对暧昧,拒绝猜测的诱惑..
应该有一种----最好只有一种----明显的办法来做到这一点。
虽然这种方式一开始可能不明显,除非你是荷兰人。
现在总比永远好。
虽然从来没有比现在更好。
如果实施很难解释,那是个坏主意。
如果实现很容易解释,这可能是个好主意。
命名空间是一个伟大的想法-让我们做更多的这些!
Chap5:api
调用Api需要有AK(Api Key)
练习三:利用百度地图api获取地理编码
import requests
def getUrl(*address):
ak = '' ## 填入你的api key
if len(address) < 1:
return None
else:
for add in address:
url = 'http://api.map.baidu.com/geocoding/v3/?address={0}&output=json&ak={1}'.format(add,ak)
yield url
def getPosition(url):
'''返回经纬度信息'''
res = requests.get(url)
#print(res.text)
json_data = eval(res.text)
if json_data['status'] == 0:
lat = json_data['result']['location']['lat'] #纬度
lng = json_data['result']['location']['lng'] #经度
else:
print("Error output!")
return json_data['status']
return lat,lng
if __name__ == "__main__":
address = ['北京市清华大学','北京市北京大学','保定市华北电力大学','上海市复旦大学','武汉市武汉大学']
for add in address:
add_url = list(getUrl(add))[0]
print('url:', add_url)
try:
lat,lng = getPosition(add_url)
print("{0}|经度:{1}|纬度:{2}.".format(add,lng,lat))
except Error as e:
print(e)
AK是百度地图API申请的,怕泄露个人信息所以直接贴例程上来了。
可以很清晰地看出,大致流程就是:按格式发送请求,收取信息,对信息格式进行处理。非常方便快捷。
官方文档: http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
Chap6:JS与AJAX
AJAX
Asynchronous JavaScript and XML,异步JavaScript与XML。得益于AJAX,网页可以在页面中使用JS,实现了对部分数据的灵活加载。在爬爬爬的过程中,有时会遇到浏览器看到的与抓取内容不同,这就是因为抓到的是原始HTML数据,浏览器中的是JS加工处理后的数据。为解决这个问题,一是分析AJAX(逆向工程)、二是模拟浏览器环境。
JavaScript
面向对象、动态类型的解释性语言。作为新一代浏览器脚本语言被设计出的它,开始涉足服务器端。
特点
动态语言:程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。
脚本语言:脚本语言是为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言,只在被调用时进行解释或编译,然后执行。
弱类型:指的是语言类型系统的类型检查的严格程度,弱类型的语言在声明变量的时候不必进行变量类型的确定,语言的运行时会隐式做数据类型转换,对于弱类型语言来说,不同类型的变量可以进行直接运算,而强类型的则不可以。
与JAVA的关系
除了变量类型和命名规范等细节,JavaScript与Java关系并不大。Netscape公司最初为之命名“LiveScript”,但当时正与Sun公司合作,加上Java语言所获得的巨大成功,为了“蹭热点”,遂将其名字改为“JavaScript”。
else
jQuery库的教程:https://www.runoob.com/jquery/jquery-tutorial.html
CDN:Content Delivery Network(内容分发网络)。如果网页使用了CDN,当用户向网站服务器请求文件时,CDN会从离用户最近的服务器上返回响应,这在一定程度上可以提高加载速度。
-20200421-