【python】爬虫代码的封装,以豆瓣新片榜爬取为例
目的
如图
封装前
url = "https://movie.douban.com/chart"
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
res = requests.get(url,headers=header)
if res.status_code == 200:
html = BeautifulSoup(res.text,"html.parser")
datas = html.find_all("div", class_="pl2")
for data in datas:
name = data.find('a').text.replace(" ", "").replace("\n", "")
score = data.find('span',class_="rating_nums").text
num = data.find('span',class_="pl").text
print(name+'【'+score+num+'】')
else:
print(res.status_code)
返回
汉密尔顿/汉密尔顿音乐剧【9.5(29446人评价)】
灰猎犬号/怒海战舰(台)/雷霆战舰:猎犬号(港)【8.3(35428人评价)】
永生守卫/不死军团(港/台)/老卫兵【6.3(11672人评价)】
好久不见,武汉/LongTimeNoSee,Wuhan【8.3(14613人评价)】
猎谎者/LiarHunter【6.8(8434人评价)】
侵入者/恶‧回家(港)/诡妹(台)【6.5(16341人评价)】
咱们裸熊:电影版/咱们裸熊大电影/熊熊遇见你电影版【7.5(5218人评价)】
翻译疑云/叛译同谋(港)/TheTranslators【7.3(12496人评价)】
前哨/72小时前哨救援(台)/前哨基地【7.1(5127人评价)】
想哭的我戴上了猫的面具/无限/想哭的我戴上了猫【6.4(13422人评价)】
第一次封装代码(有几处问题,以下一个个解决)
def movie_spider():
url = "https://movie.douban.com/chart"
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
res = requests.get(url,headers=header)
if res.status_code == 200:
html = BeautifulSoup(res.text,"html.parser")
datas = html.find_all("div", class_="pl2")
for data in datas:
name = data.find('a').text.replace(" ", "").replace("\n", "")
score = data.find('span',class_="rating_nums").text
num = data.find('span',class_="pl").text
return name,score,num
else:
print(res.status_code)
movie_spider()
第一个问题
返回什么都没有
解决:将 movie_spider()
进行赋值
name,score,num = movie_spider()
print(name+'【'+score+num+'】')
其他代码不变,返回一条
汉密尔顿/汉密尔顿音乐剧【9.5(29446人评价)】
第二个问题
只返回了一个。
原因是return相当于函数的结束,它位于for循环体内,那么执行完第一个循环之后,就会碰到 return
,返回结果就是第一个循环的结果。
所以首先确定,return 应该放在 for 循环的外面,跟def 是一体。
那么只是把它放在外面,就可以了么?【思考:它会返回什么呢?】
答案贴在文末
最终解决
不能像循环那样,一条一条的输出/返回,需要先把循环得到的【打包】
def movie_spider():
url = "https://movie.douban.com/chart"
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
res = requests.get(url,headers=header)
html = BeautifulSoup(res.text,"html.parser")
datas = html.find_all("div", class_="pl2")
list = []
for data in datas:
name = data.find('a').text.replace(" ", "").replace("\n", "")
score = data.find('span',class_="rating_nums").text
num = data.find('span',class_="pl").text
list.append(name+'【'+score+num+'】')
return list
list = movie_spider()
print(list)
返回列表
['汉密尔顿/汉密尔顿音乐剧【9.5(29454人评价)】', '灰猎犬号/怒海战舰(台)/雷霆战舰:猎犬号(港)【8.3(35451人评价)】', '永生守卫/不死军团(港/台)/老卫兵【6.3(11678人评价)】', '好久不见,武汉/LongTimeNoSee,Wuhan【8.3(14616人评价)】', '猎谎者/LiarHunter【6.8(8434人评价)】', '侵入者/恶‧回家(港)/诡妹(台)【6.5(16343人评价)】', '咱们裸熊:电影版/咱们裸熊大电影/熊熊遇见你电影版【7.5(5219人评价)】', '翻译疑云/叛译同谋(港)/TheTranslators【7.3(12502人评价)】', '前哨/72小时前哨救援(台)/前哨基地【7.1(5131人评价)】', '想哭的我戴上了猫的面具/无限/想哭的我戴上了猫【6.4(13422人评价)】']
总结
爬虫封装的时候,不是简单的把 print 改为 return
因为print是在for循环内,而return是在def内。
比如在爬取豆瓣新片榜的时候,应该将每次循环取到的数据,合成一个list,return list
答案是 ”想哭的我戴上了猫的面具/无限/想哭的我戴上了猫【6.4(13422人评价)】“