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()