116课 ---关于爬虫中分页请求的思路随堂笔记

1、优先写入

if __name__ =="__main__":

main()

这个入口程序要搞明白(面试点)


解释:每个py文件都是在__main__中的,而解释器是逐行解释源码,我们在运行我们写完的代码后,防止别的py文件乱入,达到执行自己想要的py文件,所以name == main



2、分析每一页的请求网址的不同之处,如豆瓣网,每一页都要用到start


第一页、第二页和第三页都有page,除了page不同,如在豆瓣网页的选电影中,每次加载更多则出现了不同的page_start,而其他都相同,此处应该用for循环

https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=0&genres=%E5%8A%A8%E4%BD%9C

https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=20&genres=%E5%8A%A8%E4%BD%9C

https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=40&genres=%E5%8A%A8%E4%BD%9C


3、先考虑大框架

观察页面得知,有电影类型和页面,要选择爬取怎样的电影,要爬取多少页,封装的函数里有什么内容,从以上不同点得知,有电影类别和开始页码和截至页码,而爬取过程分为三部,先构造request函数,再请求下载数据,最后再保存数据,故有以下代码框架。

def main():

category =input("请输入电影类别:")

#开始页码

    start =int(input("请输入开始页码:"))

end =int(input("请输入截至页码:"))

print("开始下载。。。。。")

for pagein range(start,end+1):

#构造req

        req = create_request(category,page)

#请求数据

        content = download_data(req)

#把数据保存到本地

        save_content(content,page)

else:

print("所有请求都完成!!")


4、考虑如何找到接口?怎样封装请求?如何进行请求?如何进行编解码?

接口运用fiddler,或者谷歌浏览器f12,里面可以找到接口


而封装函数也是有四个封装函数,第一个是for循环的函数,第二个是构造request函数,第三个是请求函数,第四个是保存数据函数

先观察是post函数还是get函数,从豆瓣中直接观察到该函数未get函数,在请求这块,使用如下的函数:

def create_request(category,page):

p = (page -1)*20                             #由于每次翻页后,start递增为20,此处为page和start之间的公式

    data = {

        "sort":"U",

        "range":"0,10",

        "tags":"",

        "start":p,                                  #此处导入了p = (page -1)*20

        "genres":category                #此处改为category是因为导入了category =input("请输入电影类别:")

}

data = parse.urlencode(data)

    url ="https://movie.douban.com/j/new_search_subjects?"

    url = url+data

headers = {

"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"

    }

req = request.Request(url=url,headers=headers)

return req

以上request函数创建完毕


5、下载的封装函数以及保存本地的封装函数

def download_data(req):

        res = request.urlopen(req)

        content =res.read().decode("utf-8")

        return content


def save_content(content,page):

        filename ="dbonline"+str(page)+".json"                  #保存本地的名字格式,此处为dbonline+页码+文件格式

         with open(filename,"w",encoding="utf-8")as fp:    #打开文件和对计算机语言进行解码,写入文档中

                fp.write(content)                                 



以下为全部代码

from urllibimport request

from urllibimport parse

def create_request(category,page):

    p = (page -1)*20

    data = {

                "sort":"U",

                "range":"0,10",

                "tags":"",

                "start":p,

                "genres":category

                }

    data = parse.urlencode(data)

    url ="https://movie.douban.com/j/new_search_subjects?"

        url = url+data

    headers = {

    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108     Safari/537.36"

        }

    req = request.Request(url=url,headers=headers)

    return req

def download_data(req):

    res = request.urlopen(req)

    content =res.read().decode("utf-8")

    return content

def save_content(content,page):

    filename ="dbonline"+str(page)+".json"

        with open(filename,"w",encoding="utf-8")as fp:

    fp.write(content)

        def main():

    category =input("请输入电影类别:")

#开始页码

    start =int(input("请输入开始页码:"))

    end =int(input("请输入截至页码:"))

    print("开始下载。。。。。")

    for pagein range(start,end+1):

#构造req

        req = create_request(category,page)

#请求数据

        content = download_data(req)

#把数据保存到本地

        save_content(content,page)

else:

    print("所有请求都完成!!")

if __name__ =="__main__":

    main()

你可能感兴趣的:(116课 ---关于爬虫中分页请求的思路随堂笔记)