失败就要找方法
既然失败了,就换个思路。 上一课也总结了,很多数据以包的形式传输,那就试试数据包能不能帮助我们。 回忆一下json的格式,今天要用到啦。
换个思路,新的方法
首先,既然是抓取数据包,没有纯粹的HTML语言,也就用不到bs4了。 然后呢,Python自带了json的格式化包,先导入他们。 (bs4)
from urllib import request
from urllib import parse
import json
第二课,第二个小爬虫
锁定目标,这次有点烦
在哪里跌倒,就在哪里继续挖坑。
- 善用浏览器:
刚才打开的双色球专属页面不要关掉,我们需要Ctrl+Shift+I的帮忙。 在网络一栏里,刷新页面可以看到网页请求了很多内容,只好挨个点过去,找一下我们要的包究竟在哪里。 - 查找数据接口:
挨个点过,能够找到数据包真正的位置。 看吧,目前选中的这个就是传递参数的数据接口 (俗称API) - 就是它了,你的API,我的数据源:
右键复制一下地址,新的URL就用它了!
Request_URL = 'http://www.cwl.gov.cn/cwl_admin/kjxx/findKjxx/forIssue?name=ssq&code=2021088'
等等,如果直接访问,岂不是每次只能查这一期的?那这个程序可就疯了。 所以,想要随时能查到下一期,这代码才有意义。 所以,删除参数,直接访问它。 代码就是要解决自动化的。
Request_URL = 'http://www.cwl.gov.cn/cwl_admin/kjxx/findKjxx/forIssue'
接着搞吗?别急,有套路。没参数,能返回啥?
4.接着分析,就这么麻烦 在“消息头”选项卡,点击右侧超级小的“重发→编辑重发”看看究竟是怎么搞的。 上面的信息告诉我们三个消息。 第一,使用的发送方法是GET 第二,数据包的内容有两条 第三,消息头有很多信息
- 开搞,伪装就很烦
良好习惯不要忘,首先我们要定义好发送给API的数据包并封装,然后还要定义好消息头。
From_Data = {
'name' : 'ssq',
'code' : '2021086'
}
From_Data = parse.urlencode(From_Data)
header = {
"Host": "www.cwl.gov.cn",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0",
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Accept-Encoding": "gzip, deflate",
"Referer": "http://www.cwl.gov.cn/kjxx/ssq/",
"X-Requested-With": "XMLHttpRequest",
"Connection": "keep-alive",
"Cookie": "UniqueID=7XqdBUr7HmrZNm9e1627911902202; Sites=_21; 21_vq=2; _ga=GA1.3.160140450.1627911944; _gid=GA1.3.281036533.1627911944; _gat_gtag_UA_113065506_1=1",
"Cache-Control": "max-age=0, no-cache",
"Pragma": "no-cache"
}
好家伙,真的是很烦。
- 在抓一次,不信抓不到:
数据包封装好了,头也装进去了,在抓一次。
req = request.Request(url=Request_URL, data=bytes(From_Data,encoding='utf-8'), headers=header)
res = request.urlopen(req)
搞定了吗?其实没有,刚才在找API的时候,可以看到返回的信息是一个Json数据包,看来要格式化一下,并且找到result才能正确读取咯!知道怎么回事,处理一下! 当然了,你需要在仔细看看找到API的时候,返回的数据包是个啥样子。
str_json = res.read().decode('utf-8')
myjson = json.loads(str_json)
info = myjson['result']
print(info[0])
运行一下?GO
Okk,拿到了,但是好乱啊!不是吗?
- 定位读取,就得仔细看看
好吧,仔细分析,其实我们要的开奖信息,就只在“red”和“blue”里面。 Esay,开搞。
print("Red:", info[0]['red'], "Blue:",info[0]['blue'])
运行一下,走你! 成功就这么简单! 到这里,我们掌握了怎样去找到一个数据API; 同时呢,还知道了怎么处理数据包; 最后呢,还知道了怎样定位读取数据包。
结束了吗?做事就要有点钻研精神
伪装头那么长,难道都是必须么? 难道你就不想,代码简单一点? 来Try一下!
熟练运用注释
“#”是Python的注释开关,主要在某位置加上,在它身后的代码都没有作用了,所以用于快速调试、代码说明。 所以在这里我每注释一句,就尝试运行,最终确认了生效的信息。
header = {
"Referer": "http://www.cwl.gov.cn/kjxx/ssq/",
}
写代码,就是要简洁
简洁的代码,咱们就能方便的看。 所以,还是附上全代码,指不定你还可以用它爬点别的东西。
from urllib import request
from urllib import parse
import json
if __name__ == "__main__":
Request_URL = 'http://www.cwl.gov.cn/cwl_admin/kjxx/findKjxx/forIssue'
From_Data = {
'name' : 'ssq',
'code' : '2021086'
}
From_Data = parse.urlencode(From_Data)
header = {
"Referer": "http://www.cwl.gov.cn/kjxx/ssq/"
}
req = request.Request(url=Request_URL, data=bytes(From_Data,encoding='utf-8'), headers=header)
res = request.urlopen(req)
str_json = res.read().decode('utf-8')
myjson = json.loads(str_json)
info = myjson['result']
print("Red:", info[0]['red'], "Blue:",info[0]['blue'])
光爬个信息就行了?做事就是要不断进步!
下一课继续,争取能够随时间自动爬取!
|