爬虫中urllib库的实例分析

上次说的是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中的参数并不一定是正确的,有时候需要去调整。(或许,我找错了也不一定???)有大佬知道的还请指点一二。总的来说还是自己经验不够,还需要多练,多看吧。
下次看看能不能解析源码,得到想要的数据吧。给自己手动加油ヾ(◍°∇°◍)ノ゙

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值