愚公移山日记·10
学习进程
今天的学习主要是实践,在先前的学习过程中了解到一个爬虫挑战的网站镀金的天空爬虫挑战刚开始了解到到这个网站时,看到里面的挑战题目,一脸懵逼,感觉很简单,但是自己一条代码也写不出来,今天又重新从新来挑战一下。
- 爬虫-基础1
爬虫的目标很简单,就是拿到想要的数据。这里有一个网站,里面有一些数字。把这些数字的总和,输入到答案框里面,即可通过本关。
题目其实是蛮简单的,就是抓取一个网页中的数据,然后求和。
代码如下:
import re
import requests
from fake_useragent import UserAgent
headers = {'User-agent':UserAgent().random,'cookie':'你的cookie'}
response = requests.get(urls,headers = headers).text
num = r' <div class="col-md-1">(.*?)</div>'
nums = re.findall(num,response)
x = 0
for k in nums:
x +=int(k)
print(x)
首先我们来看一下,我们引用的是re模块,就是正则表达式,一个比较常用的requests库,还有一个用来随机生成请求头的 fake_useragent 库,因为我们这个网站是需要登录的所以我们要把我的cookie带上(至于如何找到自己的cookie聪明的你一定会想办法解决的)
那么乐于实践的你,尝试上面的代码之后,肯定会发现,得出来的结果是一个空的列表’[]’,那么我们肯定要从新审视一下我的代码,最容易出差错的地方肯定是正则表达式,我们先来看一下我们需要匹配的地方的表达方式:
<div class="col-md-1">
350
</div>
细心的你肯定发现在这行网页源代码中含有空格,换行符,所以我们仅仅使用一个贪婪匹配的方式是不可以的。所以我们吧正则表达式改证一下为,加入空格,和换行的匹配:
num = r' <div class="col-md-1">[\s]*?(.*?)[\s]*?</div>'
用这样的正则表达式去匹配我们会得到我们想要从网站爬取的数据,但是数据还是不够美观,因为我们得到的数据前面还是会有空格,为了更好的处理,我们直接用(\d+) 来直接匹配我们的数据
num = r' <div class="col-md-1">[\s]*?(\d+)[\s]*?</div>'
这样就可以了。完整代码如下:
import re
import requests
from fake_useragent import UserAgent
headers = {'User-agent':UserAgent().random,'cookie':'你的cookie'}
urls = "http://www.glidedsky.com/level/web/crawler-basic-1"
response = requests.get(urls,headers = headers).text
num = r' <div class="col-md-1">[\s]*?(\d+)[\s]*?</div>'
nums = re.findall(num,response)
x = 0
for k in nums:
x +=int(k)
print(x)
- 爬虫-基础2
爬虫往往不能在一个页面里面获取全部想要的数据,需要访问大量的网页才能够完成任务。这里有一个网站,还是求所有数字的和,只是这次分了1000页。第二个挑战感觉会比第一个更困难一些,因为他把所有的数据分别放在1000个网页中间,但是我们只需要把我们上一题中的网页抓取方法,用一个for循环就可以了,同时再对比第一题的网页原代码,我们发现我们的正则表达式在这里依旧可匹配到数据。
import re
import requests
from fake_useragent import UserAgent
x = 0
headers = {'User-agent':UserAgent().random,'cookie':'你的cookie'}
for i in range(1,1001):
urls = "http://www.glidedsky.com/level/web/crawler-basic-2?page={}".format(str(i))
response = requests.get(urls,headers = headers).text
num = r' <div class="col-md-1">[\s]*?(\d+)[\s]*?</div>'
nums = re.findall(num,response)
for k in nums:
x +=int(k)
print(x)
这个其实没什么难度,就是一个遍历的问题,但是今天我在搞这道题的时候,问题最大的是输出的结果,题目要求的是输出所有数据的和,但是我们再求和之前,先看一下我们输出的数据是什么样的状态:
我们可以看到我们输出的结果是1000个列表,在列表中有12个数据,肯定是需要有一个for循环去遍历所有的数据并且求和,今天试了好多种办法,终于找到了解决办法,最后就有了上面的代码。
后记
今天可以说是我自学以来自己亲自去抓取一个网站,感觉很激动,尤其是再得出争取结果的时候,当然,在很多人眼中,这也许就是不问题,没有必要去大惊小怪的,我写的上面的代码其实,还仅仅是为了解决问题,而搭建的一个很粗糙的框架,代码的容错性能,健壮性,其实都是微乎其微,而且仅仅是使用了一种正则表达式,其实还有好动结局的方案,在上一篇文章中我也说到了几个方法,在面我也会用其他方法解决这两道题目。在后面的第三道题目已经是ip屏蔽,真的就设计到我的知识盲区,等以后学习到相关的内容我会继续向上冲。