BeautifulSoup库入门
Beautiful Soup is a Python library for pulling data out of HTML and XML files. It works with your favorite parser to provide idiomatic ways of navigating, searching, and modifying the parse tree. It commonly saves programmers hours or days of work.
1. BeautifulSoup库的安装终端安装方法方法:pip install beautifulsoup4。我这里其实还是用了Anaconda软件,来帮助我管理各种Python包。
下面我们对BeautifulSoup库的安装做一个简单的小测。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 ...
Requests库爬取实例
1. 京东商品页面的爬取找到一个京东商品页面,我这里选的是Apple 2019新品 MacBook Pro 16【带触控栏】九代八核i9 16G 1TB 深空灰 Radeon Pro 5500M显卡 ,链接是https://item.jd.com/100010079900.html。链接可能会失效,不过其他商品页面链接完全同理。
本例仅直接使用最后的完整代码,我们应该在此之前,先对我们爬取的页面做一些前置工作。
前置工作参照后面几个例子,一般是先在交互式页面做前置工作,确认没有问题后,再使用完整代码爬取。
12345678910111213141516import requestsdef getHTMLText(url): try: r = requests.get(url) r.raise_for_status() r.encoding = r.apparent_encoding return r.text[:1000] # 页面中只有前面小部分是商品信息,故只取前面一小部分 except: retur ...
网络爬虫的盗亦有道
1. 网络爬虫的尺寸
序号
规模
数据量
爬取速度
第三方库
目的
1
小
小
不敏感
Request库
爬取网页 玩转网页
2
中
中
敏感
Scrapy库
爬取网站 爬取系列网站
3
大
大
非常关键
定制开发
爬取全网 构建搜索引擎
我们平时见到的网络爬虫,小规模的网页爬虫占到了90%以上的比例。
不要看这样的爬虫很小,但是它针对特定网页或一系列的网页,能发挥很大的作用。
2. 网络爬虫引发的问题
骚扰问题:受限于编写水平和目的,网络爬虫将会为web服务器带来巨大的资源开销。
法律风险:服务器上的数据有产权归属,网络爬虫获取数据后牟利将带来法律风险。
泄露隐私:网络爬虫可能具备突破简单访问控制的能力,获得被保护数据从而泄露个人隐私。
3. 网络爬虫的限制
来源审查:判断User-Agent进行限制。
检查来访HTTP协议头的User-Agent域,只响应浏览器或友好爬虫的访问。
发布公告:Robots协议
告知所有爬虫网站的爬取策略,要求爬虫遵守。
发布公告仅仅是公告的形式,至于网络爬虫是否遵守,由其自身决定。
通过上面两个方法,互联网 ...
Requests库入门
Requests is an elegant and simple HTTP library for Python, built for human beings.
关于Requests库更多信息,点击这里查看Requests库官网。
1. Requsets库的7个主要方法
方法
说明
requests.request()
构造一个请求,支撑以下各方法的基础方法。
requests.get()
获取HTML网页的主要方法,对应于HTTP的GET。
requests.head()
获取HTML网页头信息的方法,对应于HTTP的HEAD。
requests.post()
向HTML网页提交POST请求的方法,对应于HTTP的POST。
requests.put()
向HTML网页提交PUT请求的方法,对应于HTTP的PUT。
requests.patch()
向HTML网页提交局部修改请求,对应于HTTP的PATCH。
requests.delete()
向HTML页面提交删除请求,对应于HTTP的DELETE。
Requests库中其实只有 ...
'LeetCode: 172. 阶乘后的零'
原题链接(英文):https://leetcode.com/problems/factorial-trailing-zeroes/description/原题链接(中文):https://leetcode-cn.com/problems/factorial-trailing-zeroes/description/
如果将一个正整数因式分解,那么其末尾的 $0$ 必然可以分解为 $2\times 5$。也就是说,因子中每一对 $2$ 和 $5$ 就对应着末尾的一个 $0$,因为 $2$ 肯定比 $5$ 多。综上,所以我们只要统计因子中有多少个 $5$ 就是结果了。根据算术基本定理中性质(5):$n!$ 的素因子分解中的素数 $p$ 的幂为 $[\frac{n}{p}]+[\frac{n}{p^2}]+[\frac{n}{p^3}]+\cdots$我们把 $p=5$ 代入,计算出结果即为所求。
12345678910111213int trailingZeroes(int n){ int count_zeros = 0; long long p = 5; ...
'LeetCode: 98. 验证二叉搜索树'
原题链接(英文):https://leetcode.com/problems/validate-binary-search-tree/原题链接(中文):https://leetcode-cn.com/problems/validate-binary-search-tree/
这个题主要有两种解法:一、利用二叉搜索树的性质:中序遍历序列严格单调递增。二、递归法逐一判断每个结点(子树)是否满足二叉搜索树的特征。方法一:
我们只需要对此二叉树进行一次中序遍历,查看其中序遍历序列是否是严格单调递增的即可。
我们并不需要将这个树的中序遍历序列记录下来,也可能不需要遍历完整棵树。当我们遍历到某结点时,只需要比较一下看看这个结点的值是否大于上一个遍历的结点的值。因此我们只需要记录上一个遍历的结点的值 $inorder\_last\_val$,并每当遍历过一个结点后,更新该值。如果遍历到某个结点时,发现当前结点的值比 $inorder\_last\_val$ 小,说明这不是一个二叉搜索树,直接中断遍历并返回 $false$;如果遍历完整棵树都没有出现这种情况,那么这就是一个二叉搜索树,返回 $true ...
SSR 科学上网方法
1. 购买 VPSVPS 选择谁家的都可以,例如搬瓦工和 Vultr,我使用的是 Vultr 的。系统建议选择 Debian,因为本文后面要使用的脚本在 Debian 上支持一键配置谷歌 BBR 加速。本篇文章重点在于配置 SSR,就不在购买 VPS 这里多码字了。
注意,并不是所有的 IP 地址都可行的,我们在开始配置 SSR 之前,要确保我们 VPS 的 22 号端口为开放状态。如果 22 号端口是关闭的,那么我们就要摧毁并重建 VPS,直到获得一个 22 号端口为开放的 IP 地址。你可以用命令行的方式来判断某个端口是否打开,也可以使用一些网站工具来帮助你。这里分享几个可以进行端口扫描的网站:1. https://www.yougetsignal.com/tools/open-ports/2. http://coolaf.com/tool/port3. http://tool.chinaz.com/update.html
2. 下载并执行脚本2.1. 使用SSH连接VPSMacOS 使用终端,输入 ssh root@xxx.xxx.xxx.xxx,后面是你的 IP 地址,再输入 ...
HDU-3555 Bomb (数位DP)
描述传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3555
给你一个数 N,问在从 1 ~ N 的数中有多少个数包含 “49”,其中 4 和 9 必须是连续的。例如 1 ~ 500中,有 49, 149, 249, 349, 449, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499 一共 15 个数包含 “49”,所以答案是 15。
思路题目范围已经到了 long long 的边界了,暴力肯定不可行。然后这个题看起来就是数位DP的简单题 😂。只要在dfs()函数中记录下上一个数是不是 4 就可以了,然后将算好的值存在 dp 数组中,记忆化搜索,这样便可以算出有多少个数不包含 “49”,再做一下减法就是答案了。唯一要注意的也就是这个题的范围了。
代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include <iostream>#include < ...
HDU-2089 不要62 (数位DP)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2089
题目大意:告诉你一个范围 n ~ m,例如 200 ~ 3000, 问你在这个范围内,不包含 62 ,也不包含 4 的数有多少个。例如 1062、1620、401 等都是不满足要求的,因为存在 62 或者 4,但像 1602 是可以的,因为不存在 62(要求必须连续)。
解题思路:数位DP简单题,对于 62,我们在 dfs() 函数中用一个参数来表示前一个位是否是 6,当前一位是 6 并且当前位是 2,就跳过不要了;对于 4,因为就一个数,所以也不用去记忆化,直接遇到就跳过就行,最后统计数目。
通过代码:123456789101112131415161718192021222324252627282930313233343536373839404142#include <iostream>#include <cstdio>#include <cstring>#define MAX 10using namespace std;int a[MAX];in ...
POJ-2352 Stars (树状数组)
描述传送门:http://poj.org/problem?id=2352
在笛卡尔坐标系上,有很多的猩猩,对于某一只猩猩,它的等级等于位置在它左下方的猩猩的数目。换句话说,设一个猩猩的坐标为 $(x_0,y_0)$,那它的等级就是所有坐标为 $(x,y)$ 的猩猩的数目,其中 $x\leqslant x_0, y\leqslant y_0$ 。一共有 $N$ 只猩猩,问你从等级 $0$ 到 $N-1$,各有多少只猩猩。
思路考虑用树状数组求解,首先将坐标排序,按纵坐标从小到大,纵坐标相同时横坐标从小到大。虽然本题已经排好了,但我们仍然有必要知道为何要这样排,下面解释。
我们按照排列好的顺序依次计算,就能保证当计算到某一只猩猩的时候,满足计算它等级条件的所有猩猩都已经提前计算完了,假设这只猩猩坐标是 $(x_0,y_0)$,那它的等级就是 $Sum(x_0)$,然后再将这只猩猩也加入到树状数组当中,即 $Modify(x_0)$。我们只需要在计算等级的时候记录一下就可以了。
另外这题设置了一个小坑,我们知道树状数组和线段树这类数据结构在计算的时候,下标是必须从 1 开始的。在本题中, ...