爬虫的目标很简单,就是拿到想要的数据。这里有一个网站,里面有一些数字。任务是计算这些数字的总和。
待爬取网站
我一般编写爬虫的流程:
1:检查 展现数据和原始数据是否一致。
2:寻找原始元素的位置。一般数据 会在 DOM文档中,json 文件中,js文件中,ws 等传输数据中。
3:直接发起请求,检查是否有反爬或者加密。
4:不能直接拿到数据,就使用 postman 完全模拟浏览器请求。
5:使用postman 完全模拟浏览器基本上都可以拿到数据的。
6:有加密就开始解密。 解密流程会复杂点。
检查 呈现数据和原始数据 是否一致。 如图所示:可以发现 呈现数据和原始数据一致。
寻找原始数据使用 ”搜索“。
按 ctrl + F
或者 ctrl + shift + f
, 然后输入想要查找的数据。
对于这个 例子,已经直接可以拿到原始数据。所以,也就没有必要找 JS, json, ws 等文件了。
直接使用 requests
库来进行模拟。
import requests
url = "http://glidedsky.com/level/web/crawler-basic-1"
res = requests.get(url)
print(res.text)
我们运行一下其实可以发现,我们是无法拿到原始数据的。这个时候不要慌,先尝试添加 headers
, 然后再验证一下。
import requests
url = "http://glidedsky.com/level/web/crawler-basic-1"
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36",
'cookies': "",
}
res = requests.get(url, headers=headers)
print(res.text)
这里需要添加自己的 cookies 信息,然后就可以拿到数据。
这个时候我们其实已经可以拿到原始的 html 文件了,并且包含了我们想要数据。这个时候,我们只需要增加一个页面解析就可以了。
我解析 html 页面一般使用 xpath 或者 re正则表达式。
这里 chorme 浏览器里面有一个 Xpath helper 插件。非常好用。
最后 xpath 的解析规则: xpath("//div[@class='col-md-1']/text()")
最后还是把 代码的结构改一下,方便重构复用啥的。
import requests
from lxml import etree
def download(url):
headers = {
'Cookie': "xxx", # 记得使用自己的 cookies
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"
}
res = requests.get(url=url, headers=headers)
return res.text
def analytics(content):
html = etree.HTML(content)
num_list = html.xpath("//div[@class='col-md-1']/text()")
return num_list
def main(url):
res = download(url)
num_list = [int(item.strip()) for item in analytics(res)]
return sum(num_list)
if __name__ == '__main__':
base_url = "http://glidedsky.com/level/web/crawler-basic-1"
sums = main(base_url)
print(sums)
最后的答案 325740。 有啥问题可以私聊我,欢迎指出错误哦!!!