程序员

【python】爬虫代码的封装,以豆瓣新片榜爬取为例

2020-07-23  本文已影响0人  山竹山竹px

目的

如图

封装前

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人评价)】“

上一篇下一篇

猜你喜欢

热点阅读