鱼C论坛

 找回密码
 立即注册
查看: 1114|回复: 4

[已解决]Python爬虫

[复制链接]
发表于 2021-2-1 12:21:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 2079501562 于 2021-2-1 12:21 编辑

在小甲鱼老师爬虫教程的视频中,有一个爬取豆瓣TOP250电影排行榜的例子
而现在的豆瓣排行榜还有评价,如肖申克的救赎“希望使人自由”
BGPF)UAU85L~JKRD3CR%9UH.png
于是产生了顺便爬取评价的想法,代码如下
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Mon Feb  1 09:15:48 2021

  4. @author: 夏の雪
  5. """
  6. import requests
  7. import bs4
  8. import os
  9. class Webpage():
  10.     def __init__(self,page_num):        
  11.         self.names = []
  12.         self.stars = []
  13.         self.quote = []
  14.         self.directors = []
  15.         self.result = []
  16.         self.years = []
  17.         headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1;WOW64) AppleWebKit/537.36 (KHTML,like GeCKO) Chrome/45.0.2454.85 Safari/537.36 115Broswer/6.0.3'}
  18.         page_url = 'https://movie.douban.com/top250?start='+str(25*(page_num-1))+'&filter='
  19.         self.res = requests.get(page_url,
  20.                            headers = headers)
  21.         soup = bs4.BeautifulSoup(self.res.text,'html.parser')
  22.         names = soup.find_all('div',class_='hd')
  23.         stars = soup.find_all('span',class_='rating_num' )
  24.         #quote = soup.find_all('span',class_='inq')
  25.         years = soup.find_all('div',class_='bd')
  26.         directors = years
  27.         
  28.         
  29.         for i in names:
  30.             self.names.append(i.a.span.text)
  31.         for i in stars:
  32.             self.stars.append(i.text)
  33.         '''        
  34.         for i in quote:
  35.             if ????:
  36.                 self.quote.append('评价暂无')
  37.             else:
  38.                 self.quote.append(i.text)
  39.         '''
  40.         for i in years:
  41.             try:
  42.                 self.years.append(i.p.text.split('\n')[2].strip().split('\xa0/')[0])        
  43.             except:
  44.                 continue
  45.         for i in directors:
  46.             try:
  47.                 self.directors.append(i.p.text.split('\n')[1].strip().split('\xa0')[0])
  48.             except:
  49.                 continue
  50.             
  51.     def save(self):
  52.         for i in range(25):
  53.             #self.result.append(self.names[i] +' 评分:'+ self.stars[i] + ' ' + self.directors[i] + ' "' + self.quote[i] + '"'  +' 上映时间:' + self.years[i] + '\n')
  54.             self.result.append(self.names[i] +' 评分:'+ self.stars[i] + ' ' + self.directors[i]  + ' 上映时间:' + self.years[i] + '\n')
  55.    
  56. if __name__ == '__main__':
  57.     '''
  58.     a = Webpage(8)
  59.     a.save()
  60.     for each in a.result:
  61.         print(each)
  62.     '''
  63.     try:
  64.         os.remove('豆瓣评分top250.txt')
  65.     except FileNotFoundError:
  66.         pass
  67.     for i in range(1,11):
  68.         a = Webpage(i)
  69.         a.save()
  70.         with open('豆瓣评分top250.txt',"a",encoding = "utf-8") as f:
  71.             for each in a.result:
  72.                 f.write(each)               
复制代码

程序中注释掉的部分为无法执行的部分,因为第8页开始有的电影并没有评价 ,导致元组的整个出现错误如下图
13{K0EFTT{14N`0L[3VO_X4.png
最佳答案
2021-2-1 14:52:07

  1. import requests
  2. from lxml import etree


  3. def main():
  4.     base_url = 'https://movie.douban.com/top250?'
  5.     headers = {'user-agent': 'firefox'}
  6.     movies = []
  7.     for x in range(0, 250, 25):
  8.         url = base_url + f'start={x}'
  9.         r = requests.get(url, headers=headers)
  10.         html = etree.HTML(r.text)
  11.         lis = html.xpath('//ol[@class="grid_view"]/li')
  12.         for li in lis:
  13.             m_name = li.xpath('.//div[@class="hd"]/a/span[1]/text()')[0]
  14.             m_rank = li.xpath('.//div[@class="pic"]/em/text()')[0]
  15.             m_score = li.xpath('.//div[@class="star"]/span[2]/text()')[0]
  16.             m_comment = li.xpath('./div/div[2]/div[2]/p[2]/span/text()')  # 获取评价
  17.             if not m_comment:   # 如果为空
  18.                 m_comment = '没有评价'   # 写入没有评价
  19.             else:
  20.                 m_comment = m_comment[0]   # 如果有值,那么取出内容(因为xpath取出后是列表)
  21.             movies.append([m_name, m_rank, m_score, m_comment])
  22.     for i in movies:
  23.         print(i)
  24.         print('=' * 100)


  25. if __name__ == '__main__':
  26.     main()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-2-1 12:21:51 | 显示全部楼层
怎么才能对没有评价的电影进行筛选补上条件,试想为代码中???的位置,筛选出没有评价的地方进行处理呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-1 13:07:15 | 显示全部楼层
没怎么用过 bs 了,现在都是用 正则。
方法的话就是不要用 find_all 获取一页所有的评价,一个一个获取,再添加到列表里,如果没有评价,则添加一个空字符串。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-1 14:52:07 | 显示全部楼层    本楼为最佳答案   

  1. import requests
  2. from lxml import etree


  3. def main():
  4.     base_url = 'https://movie.douban.com/top250?'
  5.     headers = {'user-agent': 'firefox'}
  6.     movies = []
  7.     for x in range(0, 250, 25):
  8.         url = base_url + f'start={x}'
  9.         r = requests.get(url, headers=headers)
  10.         html = etree.HTML(r.text)
  11.         lis = html.xpath('//ol[@class="grid_view"]/li')
  12.         for li in lis:
  13.             m_name = li.xpath('.//div[@class="hd"]/a/span[1]/text()')[0]
  14.             m_rank = li.xpath('.//div[@class="pic"]/em/text()')[0]
  15.             m_score = li.xpath('.//div[@class="star"]/span[2]/text()')[0]
  16.             m_comment = li.xpath('./div/div[2]/div[2]/p[2]/span/text()')  # 获取评价
  17.             if not m_comment:   # 如果为空
  18.                 m_comment = '没有评价'   # 写入没有评价
  19.             else:
  20.                 m_comment = m_comment[0]   # 如果有值,那么取出内容(因为xpath取出后是列表)
  21.             movies.append([m_name, m_rank, m_score, m_comment])
  22.     for i in movies:
  23.         print(i)
  24.         print('=' * 100)


  25. if __name__ == '__main__':
  26.     main()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-1 17:00:43 | 显示全部楼层

ava感谢鱼油的代码,里面有很多我没有学过的知识,待我研究一番~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 08:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表