这一讲我们将要放弃字符串的复杂用法,要用简单的正则表达式配合bs4模块来写代码,下面会看到这会使代码大大简化。首先来解决如何去匹配一个ip地址的问题。先来说一下正则表达式遗留的一些小问题,第一个重复字符*,?和+的用法:*表示前一个字符匹配0次或多次,(因为解释器其实是cpython,c语言里int类型有大小限制,匹配的字符最多是20亿次,我相信是不会超过这个限制的)。+是匹配前一个字符1次或者多次,?是匹配前一个字符0次或者1次。更多符号可以参考http://bbs.fishc.com/thread-57691-1-1.html
需要指出的是正则表达式默认的匹配模式是贪婪模式,什么意思呢?就是尽可能地多匹配,上面地代码里,用*的时候,尽量匹配更多的a,+和?以及其它的语句都是如此,但是还有一种是懒惰模式,格式如下,注意问号本身是贪婪的,但是在原来表达式可以正常运作的情况下再加一个?就是懒惰了的。
![](https://i-blog.csdnimg.cn/blog_migrate/d7dca29faf5e75f529ba05efab16c2ec.png)
![](https://i-blog.csdnimg.cn/blog_migrate/21daca907a4d5c7de1392a74755bd27a.png)
但是这种懒惰模式也是有规定的,如果不是以?结尾,仍然还是贪婪模式。
![](https://i-blog.csdnimg.cn/blog_migrate/d274f2b7c75365614e51ff31264e42a9.png)
上面箭头指的三行没有结果是因为多打了空格。{m,n}m没有给出则默认是0,n默认是20亿。
下面就来给出如何匹配ip的正则表达式并且返回,
![](https://i-blog.csdnimg.cn/blog_migrate/0567fe2e5851b70b27ce64182d51201f.png)
上一讲里讲过的search.group和findall都能返回,但是如果你要获得多个,那只能用findall
![](https://i-blog.csdnimg.cn/blog_migrate/1d680eb0f1c4e8600ef36dbccf1f1d28.png)
第一种不是很严谨,但是我觉得其实也可以用,ip地址这种格式的东西毕竟不多,当然第二种更严谨。这里匹配ip地址的表达式用了|符号,这是或的意思。第一种是会匹配到256-999这样的,第二和第三种使用了或,ip地址每一个数可能在200-249,250-255之间,这是前两个或,最后的[1]?\d?\d是表示的剩下的0-199,也许你还会注意到上面两个在最外面都加了(),这个是必须的,因为在正则表达式里面()是代表的分组的。
![](https://i-blog.csdnimg.cn/blog_migrate/f0c92cc53f10780225aa19b0ecf0f4b7.png)
我们暂时没有用到去给组命名,都是交给自动门命名了。findall返回的列表里的元素都是元组,元组的第一个元素是我们需要的ip。那么ip就好办了。还有一点需要重点提醒,几个或一定要用小括号括起来,不然的话就会出现
![](https://i-blog.csdnimg.cn/blog_migrate/d80d5840166b98775bf4338b13f91815.png)
这种情况就是因为或没有加括号而导致逻辑并不是你原来的逻辑了,这里为什么直接返回123?因为后面有一个或是1?\d?\d,他是和前面的{3}次的是或关系,而后面满足了条件。也许你会说,一般的匹配模式不是贪婪模式吗?但是如果你没加或的话逻辑就变成了(2[0-4]\d|25[0-5]|[1]?\d\d?\.){3}2[0-4]\d或25[0-5]或1?\d?\d也就是这种写法默认第一个或条件的第四个数必须是
200-249了,上图最后一行改了ip结果和这里的解释是相符的。当然上图还复习了一下或的短路逻辑。代理ip我们已经获取了,还有什么呢?端口号和类型对吧,我们先复习一下端口号和类型的位置在哪。
![](https://i-blog.csdnimg.cn/blog_migrate/ad5c5b49c816ccc49200ba71fd6a2c9b.png)
端口号和ip的类型我们也可以用正则表达式来写。整个程序就是这样的。
![](https://i-blog.csdnimg.cn/blog_migrate/15eb2dcdd602b730265bcd4a061b1c8d.png)
结果就是这样的,如果你的基础足够扎实,那么是可以看懂的,我就不再多说了。结果如下
![](https://i-blog.csdnimg.cn/blog_migrate/9908fa808736a7f2319b71ad2fac5d6e.png)
这个IP就可以为我们所用了,当然还要和typ配合使用。我这是爬取的代理ip很少,所以花费时间并不是很长,如果爬取得代理ip数量很多得话,我们需要用BeatifulSoup来降低计算机的搜索工作。怎么降低呢?
![](https://i-blog.csdnimg.cn/blog_migrate/89a18d4f13193b48d960a338bf6fdb48.png)
观察到有效的内容的class 属性都是等于l2,那么其他的内容计算机就可以不必搜索了,这就降低了计算机的搜索量。我们就按照类的属性来搜索。
![](https://i-blog.csdnimg.cn/blog_migrate/18d3801256b898a04695ecc623d88f9c.png)
里面有一个正则表达式的函数,compile的用法如下
![](https://i-blog.csdnimg.cn/blog_migrate/7127a6d277f22b5147c6500d9f5fad6b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a1c811a8c97da21df8e912457ef41eec.png)
下面改进一下程序吧。
![](https://i-blog.csdnimg.cn/blog_migrate/183cffecb5ae7f3b71566dd4690db8f7.png)
为什么要s1=str(s0)呢?这是因为s0是一个列表,而不是字符串或者二进制类型。
![](https://i-blog.csdnimg.cn/blog_migrate/26618c68a68a8ccc23a8846135c59fb8.png)
如果没有str那一句。就会报错,因为也是类型的问题。
![](https://i-blog.csdnimg.cn/blog_migrate/7f795cdaef99728b09ad82d0379ddc33.png)
代理ip搞定了,那么下面就来让爬去小姐姐的图片的代码更简洁吧。首先来复习一下踩点的过程。
![](https://i-blog.csdnimg.cn/blog_migrate/cda38ce6ff3efa105735f3195ffa131e.png)
class的属性都是wp-item,利用这一点来减少计算机的搜索量,虽然不一定需要,更进一步的其实我们发现这些图片的网址都在img这个标头里面,可以进一步减少搜索量。由于这个网站可能并没有设置访问频率的限制,就不用爬虫了。还有一个问题就是怎么写一个url的正则表达式呢?
![](https://i-blog.csdnimg.cn/blog_migrate/961251a5f834eb1e564998c3fe72a20c.png)
我们来解释一下这个正则表达式先。[a-zA-Z]就是所有的字母,也许你还记得\w好像也有类似的功能,但是\w还可以表示汉字和下划线,所以还是用或者更稳一点。后面有两个没有见过的^和\s,^本身的意思是匹配字符的开始,与之相反的是$是匹配字符的结束。但是这里充当的是反义,还有一点上面的pattern正则表达式里没有小括号的时候,findall就会把匹配到的整体作为分组返回。
![](https://i-blog.csdnimg.cn/blog_migrate/84cd74755bab1f438824dc76767231d5.png)
\s是匹配任意的空白符(注意大小写)。下面来实际演示一下。
![](https://i-blog.csdnimg.cn/blog_migrate/25da09185c9c2d03194676448ccb797b.png)
看到了也可以写为\S。但是这样写会有很多问题,我们不妨直接利用属性的值,因为网址正好是src的值,这样做会简单很多。
![](https://i-blog.csdnimg.cn/blog_migrate/b162092c17cea1cc69e6a59967aa54cf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a87e157c4c769469d1ee9d17afeb1027.png)
![](https://i-blog.csdnimg.cn/blog_migrate/05c3a9caac7c51c79cfaf5bd425d89ca.png)
亲测是可行的。到这里应该就可以体会到正则表达式和bs4包的简洁之处了吧。下面来处理以前遗留的练习题先。还记得那个爬百度百科的练习吗,现在都能做了。
![](https://i-blog.csdnimg.cn/blog_migrate/dd1d04655d60c6ed0f41fe3509b2d331.png)
首先要说明的是,链接都会在href属性的值里,
![](https://i-blog.csdnimg.cn/blog_migrate/7eaa9f2fbc225c7f06b30f74953468b3.png)
href与前面的src属性是不同的,参考了https://blog.csdn.net/annsheshira23/article/details/51133709
![](https://i-blog.csdnimg.cn/blog_migrate/ec0e92428b7de76bbef7266d3cb79edc.png)
src是必须有的,因为你只要放一张图片,图片必定是有来源的,你在HTML代码里就得体现,而href可以没有,但是有了会更方便用户浏览,当用户想看大图或者点开另一个链接的时候,就很很方便。查看蓝色字体,也就是链接,就会发现一个href。(我的百度百科可能和你们不一样,那只是因为我用了脚本而已)
![](https://i-blog.csdnimg.cn/blog_migrate/4b2b73c2b78ff27efcabf58798e8f5cb.png)
点一张图片会出现大图其实也是因为有href
![](https://i-blog.csdnimg.cn/blog_migrate/251e8194fa0e7b292bc8c9580e3f829c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ce6605bac5cc43266227a60490ddf22a.png)
而这张图片之所以能出现在这里是因为有src。有些图片是没有href属性的,所以你点它也没什么反应的。
![](https://i-blog.csdnimg.cn/blog_migrate/f18087035511bd40ff80be6a6cc6f5fa.png)
那么目标就很明确了 ,首先要找出带有href属性的tag,那个bs4的学习网页上一讲都已经给出来了
![](https://i-blog.csdnimg.cn/blog_migrate/40e2d09bfb426d7c37fa3b45d1624c12.png)
然后在筛选出有view的就可以了。由于我自己写过,其实就只有下面这一个。和上面的输出不一样对吧,也很正常,上面那张图片很老了。
![](https://i-blog.csdnimg.cn/blog_migrate/bfed3167539267041e93c4cce8aafe15.png)
写代码来实现一下。
![](https://i-blog.csdnimg.cn/blog_migrate/8de0e2c85de939ef39d1c506444a7454.png)
下面就来理解一下这段程序,前面修改user-agent的就不多说了。后面用BeautifulSoup4里的find_all前面也已经用过了。按类的属性其实前面也用过了,只是好像没有拿出来说,这些内容都在以前给过的https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/index.html里
![](https://i-blog.csdnimg.cn/blog_migrate/c9d02ce403727dbfda88e7ddcc384e87.png)
需要注意的是后面的re.compile('view')为什么要用一个正则表达式呢?直接用'view'可不可以呢?
![](https://i-blog.csdnimg.cn/blog_migrate/4f11e0ede72dd197765c9c61cdc3ec47.png)
![](https://i-blog.csdnimg.cn/blog_migrate/65a6a6cff45320503e70edc9827498ac.png)
就职这是不可以的,因为href='view'就表示href的属性的值就是view,而如果你跑到前面去看的话就会发现,href的属性里只是含有'view'而不是说就是'view',而re.compile('view')就表示其中含有'view'而不是说全部都是'view',为了更好理解,看一个例子吧。
![](https://i-blog.csdnimg.cn/blog_migrate/6d99f76b09c347953e71e6846d97afbd.png)
也就是说href=re.compile('view')相当于扩大了搜索范围,href属性的值里含有view的tag都会被返回,而href='view'就是说href的值必须是view才会被返回,说了这么多,希望你们可以理解这两者的区别。如果上面的程序改为find_all('view')就会什么都不会返回,因为没有href的值是'view'。
![](https://i-blog.csdnimg.cn/blog_migrate/1ddc8f418863abdd911a13ce61ba69fb.png)
看下一个点,字符串的join函数应该不是盲点,如果你前面的基础都看了。each['href']和字典的用法是一样的,那还有什么地方没有见过呢?each.text是没有见过的。
![](https://i-blog.csdnimg.cn/blog_migrate/3a9a9025b5873ebe8012812e11a02511.png)
什么值才是字符串呢?不在<>里的都是字符串,或者说在.><里的,但是还有一种特别的注释
![](https://i-blog.csdnimg.cn/blog_migrate/c949d06f05a9735c7cda264475a870f5.png)
也可以用string来获取一个tag的字符串,学到这里你可能已经有感觉了</h2>才是一个tag结束的标志。下面的代码展示了string和text的类似之处
![](https://i-blog.csdnimg.cn/blog_migrate/a9539e63a4f5ad5694b1b0cc896c7fcb.png)
不过马上我们就会看到其实它们的差别还是很大的,如果仅仅是string,那么返回的仅仅是第一个><里的内容,我们看到是没有的,所以each.string是nonetype,目前我见过的tag只会有0个或者1个字符串,所以用text更好,text会选择有的那一个输出,没有就输出none,当然我们还有each.strings,不过它是一个生成器,我们可以用next()来获取生成器里面的内容。
![](https://i-blog.csdnimg.cn/blog_migrate/5ae08cb94ca33074338515e8be41ef4c.png)
有的人可能会对编码有疑问。
![](https://i-blog.csdnimg.cn/blog_migrate/53978e7fd5e2c4094493f579bbe96ccd.png)
这个题的代码已经解释清楚了,下一道题。
![](https://i-blog.csdnimg.cn/blog_migrate/44d2839e4186fcacc05079eb6d620756.png)
首先拿到题要思考,如何实现搜索指定关键字呢?那就需要我们对百度百科的页面研究下一下了。
![](https://i-blog.csdnimg.cn/blog_migrate/04765d9c2c9eea5c52689e7ab44a59cb.png)
输入2b按进入词条以后。
![](https://i-blog.csdnimg.cn/blog_migrate/028a05d56528a4c121471cb2587d09a6.png)
我们看到最上面有两个事件,分别点开看一看。
点开第一个
![](https://i-blog.csdnimg.cn/blog_migrate/c234c33ef1b9688084ba27ba7bae60cf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b6102eb1abc656402eb636d124ceb163.png)
点开第二个
![](https://i-blog.csdnimg.cn/blog_migrate/0d303be60320b49c72daa0800cc5c588.png)
猜想可能有两种方式来访问。第一种直接输入https://baike.baidu.com/item/猪八戒,回车
![](https://i-blog.csdnimg.cn/blog_migrate/e40612ae96aa627f2119d1d4a3411e54.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ec51c915e7faab5cc4d4fefb42875c76.png)
发现至少在浏览器里是可行的。第二种https://baike.baidu.com/search/word?word=猪八戒
![](https://i-blog.csdnimg.cn/blog_migrate/44892d8a99c4a3343ae6c120a2efd7f0.png)
也可得到上面的结果。那么就先按第一种来,因为简单嘛。审查一下副标题的元素。
![](https://i-blog.csdnimg.cn/blog_migrate/bc60a400f507cf817004d1a3506225f0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3b4105ea22361d85bc465e1bfa050121.png)
看来副标题的位置相对还是比较固定的,可能按照h2这个tag就可以得到副标题,如果不能,看代码运行出来的结果在作修改。那么我们还得看看多义词是怎么存放的。对上面的几个链接检查元素。
![](https://i-blog.csdnimg.cn/blog_migrate/e1bf3a30eac7d93d33a9df3f7a0efce7.png)
几个多义存放的地方class属性的值应该都是item,并且a里面的title的值是我们需要的。
![](https://i-blog.csdnimg.cn/blog_migrate/ce59a00342928b0d5085b469940676cb.png)
我们不需要都写,因为副标题和上面的链接的内容是一样的,所以我们二选一来编程就行,我选的是利用a里面的title。大概摸清楚位置之后就可以开始写了,如果位置不足以定位你想要的信息,后面再改就行。
![](https://i-blog.csdnimg.cn/blog_migrate/ff54cfd2239f383863d194aae34caf17.png)
运行的时候会出现错误。没关系,我们要看懂错误内容就可以。说是ascii码不能对字符进行过编码,这也很好理解,因为ascii码无法编码汉字,怎么办呢?到那个文件里把ascii改为utf-8,
utf-8和ascii码是兼容的,但utf-8是可以编码汉字的。
![](https://i-blog.csdnimg.cn/blog_migrate/08ec1c5f4b5e3046ddbd899c29a64693.png)
进入最下面错误的那个py,到1107行。怎么到1107行呢?按alt+g或者点edit里面有一个go to line,输入1107,点ok
![](https://i-blog.csdnimg.cn/blog_migrate/f0ab9c2af024a9f9539a57fad49da744.png)
然后把ascii改为utf-8。记得要保存。
![](https://i-blog.csdnimg.cn/blog_migrate/a28c90f0d02119d940b63d7af5604a96.png)
然后来运行我们的程序。哎,还是有错啊。我们得就看看each的内容了。发现了什么,是不是没有a啊,只有span。
![](https://i-blog.csdnimg.cn/blog_migrate/c11c3c7756b9a4c1cdbd3e8c7eec1bd0.png)
原来我们当前浏览的这个页面的副标题不是在a这个tag的title里。这点我们小改一下即可,如果你想用第二种方法,那你就必须要打开很多网页,因为一个网页里只有一个h2,你要打开所有的多义词链接才可以,太麻烦,不如来改进这一点。
![](https://i-blog.csdnimg.cn/blog_migrate/177b83351c0ab256befdd594a59baf74.png)
改进一下我们的程序。
![](https://i-blog.csdnimg.cn/blog_migrate/ceb468e260f489425a45d099bc35d054.png)
完工了。
![](https://i-blog.csdnimg.cn/blog_migrate/09f919e8365773c13f08c80d53a5e40f.png)
没想到孙悟空还挺多的。
![](https://i-blog.csdnimg.cn/blog_migrate/2eb641069475dda25216a93c4e96160c.png)
那么还有下一道题,就是优化一下上个程序而已。
![](https://i-blog.csdnimg.cn/blog_migrate/49a09c766b50a20859ddbf0cae84f006.png)
那么我们先看看如果搜索百度百科没有收录的内容会在哪里报错。enmmm,并没有报错,而是什么都没有返回,如果你打soup,会得到下面的结果。
![](https://i-blog.csdnimg.cn/blog_migrate/36618a13207606621bbf735e04278c71.png)
![](https://i-blog.csdnimg.cn/blog_migrate/811517fb4e1b6278d0c86bd4b32381a4.png)
如何改进呢?其实会发现这个页面是没有item的,其一我们可以find试试,
![](https://i-blog.csdnimg.cn/blog_migrate/18c22aceb8f30c68593811ea6751d031.png)
或者直接看。
![](https://i-blog.csdnimg.cn/blog_migrate/6b40855cb72fe2e3ce3646dbe9c46a28.png)
那么可以加一个判断条件就可以解决第二个问题,第一个要求先放出来10条的要求用生成器确实很好写,虽然不用生成器也可以完成的,就当是复习一下生成器了。
![](https://i-blog.csdnimg.cn/blog_migrate/25f676c5e6d57db1949952b6261c4932.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c0b2cbe951eb040c7ca31e9f229a80b1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/86f191e75bac0bb47caa61e3596235e6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/265baa91e71fbc8bbd72526d3f4c023e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/11c342c129485c5a3f83a524c1e0fb05.png)
亲测是可行的。这里面的try和except是不可少的,可能有的人已经忘了,我们看看没有的后果。
![](https://i-blog.csdnimg.cn/blog_migrate/885ecbb85f2b58ac0d5adfe73ab6cad8.png)
不用生成器可不可以呢?也是可以的。用容器类型就可以:
![](https://i-blog.csdnimg.cn/blog_migrate/3d85e02f666c019763631122b306afe6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/10e7eda4d51cd22c8f702e66192accbf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8e3c9ca1363405c9166610ce4d38a5bc.png)
多给几种方法就是要告诉你们脑袋要灵活,知识是活的,解决一个问题的办法不止一个。
最后一道练习,还有一个登陆豆瓣网的对吧。我们就来搞定这个吧。首先老样子,踩点作业。
![](https://i-blog.csdnimg.cn/blog_migrate/9193b4f0e058ce5caa09f9b72f3a32c3.png)
豆瓣前三次登陆是不要验证码的,但是我今天已经登录次数超过三次了,后面可能会用代理ip来试试,有可能不要验证码的情况。首先我们点进去login。Request URL是我们登陆的网址。
![](https://i-blog.csdnimg.cn/blog_migrate/d188b6db38eddce2088f519b5b4e8d30.png)
![](https://i-blog.csdnimg.cn/blog_migrate/989ac2d96c1a58ac818112ffe1355dff.png)
还记得以前爬有道翻译的时候吗。
![](https://i-blog.csdnimg.cn/blog_migrate/4b4552817416d4d030b8a797eb6684ca.png)
这个From data就是在Request的data参数里要填写的内容,并且还有转化为json格式。我们先来看看验证码的地址在哪里。
![](https://i-blog.csdnimg.cn/blog_migrate/5fa1beb3cd24c31f5a472fd3906eb598.png)
验证码地址有了。我们先来看如果登陆成功了会怎样,首先网页会变。
![](https://i-blog.csdnimg.cn/blog_migrate/74949bbbae8feb5db578b4a0244e93a6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5c6a19c62edc6d339faad29c6398bc1a.png)
看得出来captcha solution就是填验证码的地方。眼尖的人可能会发现captcha-id变了,虽然不确定它是否会影响到我们的登陆,但是我们还是看看这东西在哪,既然和验证码有关,就应该在验证码地址的附近,很快就可以发现。如果你不知道怎么找,怎么办?
![](https://i-blog.csdnimg.cn/blog_migrate/6aee6a54bff328de7ae8f7b99b5ce998.png)
其实很简单的在IDLE里查找就行了。
![](https://i-blog.csdnimg.cn/blog_migrate/bd50c681605786cfc9e179c7f9e1e2e5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4419b08c363decca4c22b89ddfc81f59.png)
看了这些好像已经可以做了呢,那就来试试。
![](https://i-blog.csdnimg.cn/blog_migrate/9fdfed771df591e03acfe150fe0a2938.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fd59e3f7779691bb1a34e5e63f5dc59e.png)
然后结果呢?
![](https://i-blog.csdnimg.cn/blog_migrate/48f19d8e07c435aa61df2658f1037831.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4edb8245c3937abb1c04cc539a7aefb8.png)
和用网页登陆的比较一下。
![](https://i-blog.csdnimg.cn/blog_migrate/5254f679162fcd61b93c07323692774a.png)
好像有点不一样。这次我们故意不填验证码呢?
![](https://i-blog.csdnimg.cn/blog_migrate/04ccbd598bc4c65adb40a09023edeb77.png)
是可以看出来差别的。那么下面用代理ip来试一下,前面说过前三次是不需要填验证码的。
![](https://i-blog.csdnimg.cn/blog_migrate/1b704e8fa48aa00a7b7e92931ef42d4a.png)
注意这里的代理一定要用https类型的,因为豆瓣是https的,前面讲过这个类型是必须匹配的,不然相当于是没有用代理,上一讲说过这个问题的,应该有印象的。
![](https://i-blog.csdnimg.cn/blog_migrate/5135f3928c3553c9d990c21809e7a3ef.png)
就出现了
![](https://i-blog.csdnimg.cn/blog_migrate/0457298fa026d54f3a504f35fbd2a8a9.png)
imgurl为什么是Nonetype呢?我们把html打印出来看看。搜索captcha_image
![](https://i-blog.csdnimg.cn/blog_migrate/28529ed3027d52a3dd56ae9c7a36c8e0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c1057fbbf3df1cc6754546042f95cb13.png)
你会发现是没有的,那么为了让前三次登陆也可以用这个代码(由于今天我已经超过了三次,就用代理ip来试),需要改动。主要是判断下imgurl是不是空的。
![](https://i-blog.csdnimg.cn/blog_migrate/1ee2d0b44b567b7be6f2c25f1a11e095.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d12967ceb3055613eba50885c7d1cc2a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3e72d2ba4bcf6523fccf10eda5b7f894.png)
看到是不需要验证码就可以登陆成功的。这一讲就先到这里了。如果喜欢的,清点一波关注。我有个小目标,希望能有250粉丝,也许有生之年看不到了233.