上次说的是urllib库的基本使用,这次是对一些实例进行展示和一定的分析。
1、ajax的get请求
实例一:db电影页面的爬取
首先,需要来找接口,这也是最重要的一步!
从上图可以看出,我们在ajax接口中发现了页面的接口,能够看到页面的相关信息,这就是我们需要的接口。
我通过自己的爬取,发现了问题,主要也是自己学习的原因,这里的参数并没有想象的那么简单。从图中可以发现,这里对页面进行滑动后,它又刷新出了新的页面。可以看到其中的start是在改变的,此时我知道了,这个页面的滑动相当于点击下一页,所以这个“start”参数相当于页码的变化,所以需要进行参数的传递。(这也是我没有经验,才想当然的爬取)进行改进后的代码如下:
import urllib.request
import urllib.parse
# https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start=20&limit=20
# https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start=40&limit=20
# 这里将两个url放这里可以清楚的看出规律和对比
def create_request(page):
'''请求对象定制'''
base_url = 'https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&'
data = {
'start': (page-1) * 20, #通过页面的规律得出此参数
'limit': 20
}
data = urllib.parse.urlencode(data)
url = base_url + data
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36 SLBrowser/6.0.1.4221',
}
request = urllib.request.Request(url=url, headers=headers)
return request
def get_content(request):
'''获取内容'''
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
return content
def down_load(page, content):
'''下载'''
with open('douban_'+str(page)+'.json', 'w', encoding='utf-8') as fb: # 这里文件的格式为什么是json,主要是取决于你,也可以是html,下载下来就是网页。
fb.write(content)
if __name__ == '__main__':
startpage = int(input('输入起始页:'))
endpage = int(input('输入结束页:'))
for page in range(startpage, endpage + 1):
request = create_request(page)
content = get_content(request)
down_load(page, content)
我这里对相关的代码进行定义函数方法并调用,我引入了page这个参数,需要我进行手动输入页码,当然也可以设置成固定的,就不需要我这样。看一下结果:
这里可以看到,数据已经下载下来了,当然这下载的知识源码,还不能算是真正的爬取。但已经算是完成一半了,剩下的就是进行解析,就可以得到相关数据。
2、ajax的post请求
实例二:kdj页面的爬取
这里我要爬取的是kdj页面中的某城市中kdj店面的相关信息,并不是它官网的信息。一般来说我们爬取的是一些有用的信息,所以选择这个来爬取。
经过查找,可以看到,这个接口就是我们需要找的,下方的数据是我所需要的。上次也说到,get请求和post请求其实没有本质上的区别,只需要注意一些地方即可。话不多少,上代码。
import urllib.request
import urllib.parse
# http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword
def create_request(page):
'''请求对象的定制'''
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
data = {
'cname': '成都', # 这里需要注意的是,url中的keyword是我们这里的'成都',也就是字典中的'value',上图中的'cname'是这里字典中的'key'。通俗的说,url中的'op='是等于输入的城市。
'pageIndex': page,
'pageSize': '10',
}
data = urllib.parse.urlencode(data).encode('utf-8')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36 SLBrowser/6.0.1.4221',
}
request = urllib.request.Request(url=url, data=data, headers=headers)
return request
def create_content(request):
'''获取内容'''
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
return content
def down_file(page, content):
'''下载'''
with open('kfc_'+str(page)+'.json', 'w', encoding='utf-8') as fb:
fb.write(content)
if __name__ == '__main__':
startpage = int(input('请输入起始页码:'))
endpage = int(input('请输入结束页码:'))
for page in range(startpage, endpage + 1):
request = create_request(page)
content = create_content(request)
down_file(page, content)
可以看到上图为抓取到的第二页的页面源码。这里也是多注意url和data中的参数统一,不然还是会抓取出错的,我也是试错过来的,手动为自己抹泪o(╥﹏╥)o。算是长经验了吧。
给大家分享的也是我成长的过程o(╥﹏╥)o,总结一波。
首先,重中之重还是找接口,接口找到了才能往下写。
其次,特别要注意post请求中的url,还有就是昨天忘记说的o(╥﹏╥)o,url下面还有个Form Data,这里是data字典中需要的。一定一定一定要注意!url中的参数并不一定是正确的,有时候需要去调整。(或许,我找错了也不一定???)有大佬知道的还请指点一二。总的来说还是自己经验不够,还需要多练,多看吧。
下次看看能不能解析源码,得到想要的数据吧。给自己手动加油ヾ(◍°∇°◍)ノ゙