Skip to content

Commit

Permalink
增加网络工程师和算法笔记
Browse files Browse the repository at this point in the history
  • Loading branch information
zjp authored and zjp committed Nov 29, 2021
1 parent c6c0d6f commit 7263718
Show file tree
Hide file tree
Showing 132 changed files with 3,969 additions and 1 deletion.
Binary file added .DS_Store
Binary file not shown.
123 changes: 123 additions & 0 deletions Python/爬虫从入门到入土.md
Original file line number Diff line number Diff line change
Expand Up @@ -1241,3 +1241,126 @@ root:

可以看到代码是非常清晰的,但是这并不是一开始就是的,我大概花了一到两天的时间写了这个系统的爬虫,但是解析 html 的时间花了我3-4 天,因为页面标签的解析比较麻烦,还有后续一些调试操作。解析主要用到 BeautifulSoup 和 xpath, xpath 这个谷歌浏览器本身已经支持了,所以省去很多操作。

# 5. 值得看的教程

目前,单个机器的爬虫性能有限,实际生产中经常使用分布式爬虫,而支持的比较好的是 Scrapy 教程。当然在 Python 中, 还有 http 请求库 requests 和 解析 html/xml 的库 BeatifulSoup

[Scrapy 官网](https://scrapy.org)

[B 站视频-Python + Selenium Web自动化 全套教程 自动化测试 软件测试](https://www.bilibili.com/video/BV1Z4411o7TA)

[Requests: 让 HTTP 服务人类](https://docs.python-requests.org/zh_CN/latest/)

[Beautiful Soup 4.4.0 文档](https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/)

对于 requests 库函数, 最重要的是掌握其带 cookies 的方法和保持会话的方法。

带 cookies:

## requests Cookie

如果某个响应中包含一些 cookie,你可以快速访问它们:

```
>>> url = 'http://example.com/some/cookie/setting/url'
>>> r = requests.get(url)
>>> r.cookies['example_cookie_name']
'example_cookie_value'
```

要想发送你的cookies到服务器,可以使用 `cookies` 参数:

```
>>> url = 'http://httpbin.org/cookies'
>>> cookies = dict(cookies_are='working')
>>> r = requests.get(url, cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'
```

Cookie 的返回对象为 [`RequestsCookieJar`](https://docs.python-requests.org/zh_CN/latest/api.html#requests.cookies.RequestsCookieJar),它的行为和字典类似,但接口更为完整,适合跨域名跨路径使用。你还可以把 Cookie Jar 传到 Requests 中:

```
>>> jar = requests.cookies.RequestsCookieJar()
>>> jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
>>> jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
>>> url = 'http://httpbin.org/cookies'
>>> r = requests.get(url, cookies=jar)
>>> r.text
'{"cookies": {"tasty_cookie": "yum"}}'
```

[参见 cookies](https://docs.python-requests.org/zh_CN/latest/user/quickstart.html#cookie)

## requests 保持会话

**会话对象**

会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 `urllib3`[connection pooling](http://urllib3.readthedocs.io/en/latest/reference/index.html#module-urllib3.connectionpool) 功能。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。 (参见 [HTTP persistent connection](https://en.wikipedia.org/wiki/HTTP_persistent_connection)).

会话对象具有主要的 Requests API 的所有方法。

我们来跨请求保持一些 cookie:

```
s = requests.Session()
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")
print(r.text)
# '{"cookies": {"sessioncookie": "123456789"}}'
```

会话也可用来为请求方法提供缺省数据。这是通过为会话对象的属性提供数据来实现的:

```
s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'})
# both 'x-test' and 'x-test2' are sent
s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
```

任何你传递给请求方法的字典都会与已设置会话层数据合并。方法层的参数覆盖会话的参数。

不过需要注意,就算使用了会话,方法级别的参数也不会被跨请求保持。下面的例子只会和第一个请求发送 cookie ,而非第二个:

```
s = requests.Session()
r = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(r.text)
# '{"cookies": {"from-my": "browser"}}'
r = s.get('http://httpbin.org/cookies')
print(r.text)
# '{"cookies": {}}'
```

如果你要手动为会话添加 cookie,就使用 [Cookie utility 函数](https://docs.python-requests.org/zh_CN/latest/api.html#api-cookies) 来操纵 [`Session.cookies`](https://docs.python-requests.org/zh_CN/latest/api.html#requests.Session.cookies)

会话还可以用作前后文管理器:

```python
with requests.Session() as s:
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
```

这样就能确保 `with` 区块退出后会话能被关闭,即使发生了异常也一样。

[参见 会话对象](https://docs.python-requests.org/zh_CN/latest/user/advanced.html#session-objects)



一般使用 with 关键字保持会话,

```python
with requests.Session() as s:
// 若干请求
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
```

2 changes: 2 additions & 0 deletions weitu.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,5 @@ kafaka

xpath

#

24 changes: 24 additions & 0 deletions 人文/《家.拼搏.希望》.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# 《法水君自传-----一个程序员的自白》

我生于农村的一个及其普通家庭,小时候大家的家境差距并不大,所以 8 岁以前的童年其实留给我很好的印象。从 7 岁以后,一方面是进入学校学习,另一方面,各个家庭的差距其实慢慢体现出来了。其实,早年的我是调皮的,我经常在该上课的时间和村里的小伙伴逃学去田里玩。



小学三年级的时候张老师说了一句数学可以提前预习,我半信半疑地试了提前预习,发现课本上的习题我居然能自己做出,我发现了我可以不依靠老师而使用自己的力量而获得知识,从那以后,我就开始了不依靠老师而自己学习数学知识,从那以后,我的数学成绩和能力显而易见地得到不断提升,带动我其他科目的成绩。



我的性格有母亲的忍耐,也有父亲的嫉恶如仇,打抱不平。我父亲那一辈谋生还要和一帮流氓地痞打架,这也是我们家最值得自傲的事情,父亲给我的印象是他那伟岸的人格,他那高度忍耐,为了他认为亲人的人付出一切代价。父亲又是位严厉的父亲,在我读书的时候不断鞭策我前进,他又是世界上最温柔的人,在我最落寞的时候又屡次收留我。



到了初中,其实我是个放牛娃,放假后经常帮家里放牛,我觉得很快乐,那是一段非常美妙的时光。我和同村的小伙伴们经常去村里的各种山里田里玩耍,我们玩各种游戏,那的确是段值得回忆的时光。初中那时候,还出现一个情况,那就是生病。我都不知道初中的时候生过几次病,吃过的药让我现在都觉得害怕。《生病》一直是我初中生活的一个主题。初中其实还是一个充满霸凌的地区,我遇到过好几次霸凌,但因为同学认识的关系而逃过,老实说,对这些人,我瞥过他们一眼,有人想干我,我是不怕的,因为小学的我就是从打架过来的。被打打回来就好了,所谓“打架哲学”不就是以牙还牙,以眼还眼嘛。



到了高中,性幻想困扰了我整整一年,这一方面源于初中时期在家长不知不觉的灌输下,脑中经常出现这种奇怪的念头,这可以说是我遇到过的思想斗争。我一直尝试说服自己,接受它,只有接受它,你才能接受自己,从而断绝这种想法。整整斗争了一年,期间我一直保持和女性的距离,以免我自己再次收到思想侵害。 这时候高一的广播经常播放一则新闻,大意是一名高中男同学在路上将他的女同学强奸了,这使我非常害怕,我害怕自己把控不住,成为像他那样的人。于是,我开始转移注意力,将主要心力放在学习微积分,大概高一吧,微积分的方法我掌握得差不多,这时候遇到了我一个同班同学,他时常去图书馆借一本《微积分》,于是,我们经常一起讨论物理和数学书里的知识和原理,偶尔还互相出题,我们之间交流了两年,这两年我们成为了知己。我这位同学非常优秀,高中毕业后就去了中国科技大学,而我,放弃数学,选择“实验数学”, 俗称计算机科学与技术。





Empty file removed 人文/爱国心与自觉心.md
Empty file.
24 changes: 24 additions & 0 deletions 人文/精神力和意志力.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# 1. 工作时间拉长,作息时间缩短

当今的时代,工作的时间被不断拉长,作息时间被不断缩短,因此如何安排时间便成了工作者必须克服的一个难题。





# 2. 早睡早起

随着网络的普及,娱乐平台的兴起,我们熬夜到凌晨 2-3 点变成了正常现象,这对我们的精神力影响非常严重。由此,消耗我们的意志力和体力,给我们的生活和工作带来了很大的麻烦,那么如何杜绝此类现象呢?

一个是坚决杜绝加班,减少加班次数和时长,工作者每天要提前起床,花费在通勤上的时间远不止 8 个小时,因此,工作者实际能自由安排的时间决不超过 6 个小时。

另一个是养成早睡早起的习惯,这个对于个人来说,要求放下手机,进入深度睡眠的状态。



# 3. 坚持锻炼

只有不加班,工作者才有足够的时间安排个人的锻炼活动。锻炼身体,能增强个人体质,提升精气神,培养人的意志力。无论做什么事,我们都有坚强的体质为后盾,就不会轻易陷入精神萎靡、昏昏欲睡的境地。



36 changes: 36 additions & 0 deletions 其他/Maven 添加本地 jar.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Maven 添加本地 jar 包

将 jar 添加到 maven 仓库,可以自定义 groupId, artifactId, version, 如 groupId:google artifactId: concurrent, version:1.3.4

则在 maven 仓库中新建 google/concurrent 目录

在 concurrent 目录下新建 “1.3.4 ” 文件夹, 该文件夹下放置 jar 包和 pom 文件, 文件名中间以 “-” 即减号隔开

jar 包文件名格式为 <artifactId>-<version>.jar

pom 文件名格式为 <artifactId>-<version>.pom

如 concurrent-1.3.4.pom:

```xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>google</groupId>
<artifactId>concurrent</artifactId>
<version>1.3.4</version>
<name>Dough Lea's util.concurrent package</name>
</project>
```

在 pom.xml 中引入

```xml
<dependency>
<modelVersion>4.0.0</modelVersion>
<groupId>google</groupId>
<artifactId>concurrent</artifactId>
<version>1.3.4</version>
</dependency>
```

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
### 0. 修复 bug

访问 https://waterlaw.cn/articles/1 出现 500 号错误, 目前发现的情况有:
访问 https://waterlaw.top/articles/1 出现 500 号错误, 目前发现的情况有:
jieba 中文分词的 cache 每次大约占用 0.8~1.8 秒,怀疑是此原因, 待排查。

nginx.conf 文件修改如下, 则正常, 另外服务器不要使用 django 原生服务器(仅在本地开发中使用)
Expand Down
Loading

0 comments on commit 7263718

Please sign in to comment.