鱼C论坛

 找回密码
 立即注册
查看: 4428|回复: 40

爬虫经典案例——豆瓣Top250电影

[复制链接]
发表于 2023-12-11 15:40:58 | 显示全部楼层 |阅读模式

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

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

x
要求:写一个爬虫或者爬虫框架,在豆瓣电影(https://movie.douban.com/top250?)抓取250部电影的电影名称、导演与演员、电影评分、首次上演日期、评价人数、电影总结、海报封面地址以及每部电影的详情页地址,并进行保存(text或者csv格式)。

写的代码如下,但是上演日期,海报封面地址以及每部电影的详情页地址不会找路径,有没有大佬完善一下我的代码

  1. from lxml import etree   
  2. import time               
  3. import random            
  4. import requests           
  5. header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}

  6. def processing(strs):
  7.     s = ''  
  8.     for n in strs:
  9.         n = ''.join(n.split())  
  10.         s = s + n  
  11.     return s      
  12. def get_movie_info(url):
  13.     response = requests.get(url,headers=header)                  
  14.     html = etree.HTML(response.text)                              
  15.     div_all = html.xpath('//div[@class="info"]')
  16.     for div in div_all:
  17.         names = div.xpath('./div[@class="hd"]/a//span/text()')   
  18.         name = processing(names)                                    
  19.         infos = div.xpath('./div[@class="bd"]/p/text()')         
  20.         info = processing(infos)                                   
  21.         score = div.xpath('./div[@class="bd"]/div/span[2]/text()')      
  22.         evaluation = div.xpath('./div[@class="bd"]/div/span[4]/text()')  
  23.         url_movie = html.xpath('//div[@class="hd"]/a/@href')
  24.         summary = div.xpath('.//p[@class="quote"]/span/text()')
  25.         #summary = div.xpath('./div[@class="bd"]/p[@class="quote"]/span/text()')
  26.         print('电影名称:',name)
  27.         print('导演与演员:',info)
  28.         print('电影评分:',score)
  29.         print('评价人数:',evaluation)
  30.         print('电影总结:',summary)
  31.         print(url_movie)
  32.         print('--------分隔线--------')
  33. if __name__ == '__main__':
  34.     for i in range(0,250,25):   
  35.         url = 'https://movie.douban.com/top250?start={page}&filter='.format(page=i)
  36.         get_movie_info(url)                     
  37.         time.sleep(random.randint(1,3))         
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-12-11 15:47:25 | 显示全部楼层
@FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-11 16:01:39 | 显示全部楼层
FishC 发表于 2023-12-11 15:47
你好!有什么问题我能帮助你解答的吗?

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继 ...

如果首次上演日期在电影详情页地址里面,该如何获取
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-11 16:02:25 | 显示全部楼层
爱意随风起9306 发表于 2023-12-11 16:01
如果首次上演日期在电影详情页地址里面,该如何获取

@FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-11 16:10:04 | 显示全部楼层
写一个爬虫或者爬虫框架,在豆瓣电影(https://movie.douban.com/top250?)抓取250部电影的电影名称、导演与演员、电影评分、首次上演日期、评价人数、电影总结、海报封面地址以及每部电影的详情页地址,并进行保存(text或者csv格式)。@FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-11 16:18:31 | 显示全部楼层
  1. from lxml import etree    # 导入etree子模块
  2. import time               # 导入时间模块
  3. import random             # 导入随机模块
  4. import requests           # 导入网络请求模块
  5. header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
  6. # 处理字符串中的空白符,并拼接字符串
  7. def processing(strs):
  8.     s = ''  # 定义保存内容的字符串
  9.     for n in strs:
  10.         n = ''.join(n.split())  # 去除空字符
  11.         s = s + n  # 拼接字符串
  12.     return s      # 返回拼接后的字符串
  13. # 获取电影信息
  14. def get_movie_info(url):
  15.     response = requests.get(url,headers=header)                    # 发送网络请求
  16.     html = etree.HTML(response.text)                               # 解析html字符串
  17.     div_all = html.xpath('//div[@class="info"]')
  18.     for div in div_all:
  19.         names = div.xpath('./div[@class="hd"]/a//span/text()')   # 获取电影名字相关信息
  20.         name = processing(names)                                    # 处理电影名称信息
  21.         infos = div.xpath('./div[@class="bd"]/p/text()')         # 获取导演、主演等信息
  22.         info = processing(infos)                                   # 处理导演、主演等信息
  23.         score = div.xpath('./div[@class="bd"]/div/span[2]/text()')      # 获取电影评分
  24.         evaluation = div.xpath('./div[@class="bd"]/div/span[4]/text()')  # 获取评价人数
  25.         url_movie = div.xpath('./div/a/@href') #电影下载地址
  26.         # 获取电影总结文字
  27.         summary = div.xpath('.//p[@class="quote"]/span/text()')
  28.         #summary = div.xpath('./div[@class="bd"]/p[@class="quote"]/span/text()')
  29.         print('电影名称:',name)
  30.         print('导演与演员:',info)
  31.         print('电影评分:',score)
  32.         print('评价人数:',evaluation)
  33.         print('电影总结:',summary)
  34.         dates = div.xpath('./div/div[2]/p[1]/text()')
  35.         date = processing(dates)
  36.         print('首次上演日期:', date)
  37.         poster_urls = div.xpath('./div/a/img/@src')
  38.         if poster_urls:
  39.             poster_url = poster_urls[0]
  40.             print('海报封面地址:', poster_url)
  41.         print('电影详情页地址:', url_movie[0])
  42.         print('--------分隔线--------')
  43. if __name__ == '__main__':
  44.     for i in range(0,250,25):    # 每页25为间隔,实现循环,共10页
  45.         # 通过format替换切换页码的url地址
  46.         url = 'https://movie.douban.com/top250?start={page}&filter='.format(page=i)
  47.         get_movie_info(url)                      # 调用爬虫方法,获取电影信息
  48.         time.sleep(random.randint(1,3))          # 等待1至3秒随机时间
复制代码
  1. import requestsfrom lxml import etreeheader = {    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}def processing(strs):    s = ''    for n in strs:        n = ''.join(n.split())        s = s + n    return sdef get_movie_info(url):    response = requests.get(url, headers=header)    html = etree.HTML(response.text)    # 获取电影详情页地址列表    url_movie = html.xpath('//div[@class="hd"]/a/@href')    for movie_url in url_movie:        # 进入每个详情页        response_movie = requests.get(movie_url, headers=header)        html_movie = etree.HTML(response_movie.text)        # 获取首次上演日期        dates = html_movie.xpath('//span[@property="v:initialReleaseDate"]/text()')        date = processing(dates)                # 打印首次上演日期        print('首次上演日期:', date)if __name__ == '__main__':    for i in range(0, 250, 25):        url = 'https://movie.douban.com/top250?start={page}&filter='.format(page=i)        get_movie_info(url)
复制代码



能将这两段代码结合为一段代码吗,看起来简洁美观一点@ FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-11 16:53:47 | 显示全部楼层
@ FishC 帮我改良一下代码,代码中的首次上演日期,全部都是一样的日期,除此以外,还有其他地方需要修改的代码也进行修改,并标注出来
  1. from lxml import etree
  2. import time
  3. import random
  4. import requests
  5. header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
  6. def processing(strs):
  7.     s = ''
  8.     for n in strs:
  9.         n = ''.join(n.split())
  10.         s = s + n
  11.     return s

  12. def get_movie_info(url):
  13.     response = requests.get(url,headers=header)
  14.     html = etree.HTML(response.text)
  15.     div_all = html.xpath('//div[@class="info"]')
  16.     url_movie = html.xpath('//div[@class="hd"]/a/@href')
  17.     for movie_url in url_movie:
  18.         # 进入每个详情页
  19.         response_movie = requests.get(movie_url, headers=header)
  20.         html_movie = etree.HTML(response_movie.text)

  21.     for div in div_all:
  22.         names = div.xpath('./div[@class="hd"]/a//span/text()')
  23.         name = processing(names)
  24.         infos = div.xpath('./div[@class="bd"]/p/text()')
  25.         info = processing(infos)
  26.         score = div.xpath('./div[@class="bd"]/div/span[2]/text()')
  27.         evaluation = div.xpath('./div[@class="bd"]/div/span[4]/text()')
  28.         url_movie = div.xpath('./div/a/@href')
  29.         summary = div.xpath('.//p[@class="quote"]/span/text()')
  30.         poster_urls = div.xpath('./div/a/img/@src')
  31.         dates = html_movie.xpath('//span[@property="v:initialReleaseDate"]/text()')
  32.         date = processing(dates)
  33.         print('电影名称:',name)
  34.         print('导演与演员:',info)
  35.         print('电影评分:',score)
  36.         print('评价人数:',evaluation)
  37.         print('电影总结:',summary)
  38.         print('电影详情页地址:', url_movie[0])
  39.         print('首次上演日期:', date)
  40.         if poster_urls:
  41.             poster_url = poster_urls[0]
  42.             print('海报封面地址:', poster_url)
  43.         print('--------分隔线--------')
  44. if __name__ == '__main__':
  45.     for i in range(0,250,25):
  46.         url = 'https://movie.douban.com/top250?start={page}&filter='.format(page=i)
  47.         get_movie_info(url)
  48.         time.sleep(random.randint(1,3))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-11 17:11:34 | 显示全部楼层
爱意随风起9306 发表于 2023-12-11 16:53
@ FishC 帮我改良一下代码,代码中的首次上演日期,全部都是一样的日期,除此以外,还有其他地方需要修改的 ...

@FishC
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-11 17:12:49 | 显示全部楼层
FishC 发表于 2023-12-11 17:11
哈喽,我是FishC的计算机教育专家!欢迎来到编程的世界,有什么问题我可以帮助你解答呢?

以上回复来 ...

帮我改良一下代码,代码中的首次上演日期,全部都是一样的日期,除此以外,还有其他地方需要修改的代码也进行修改,并标注出来
  1. from lxml import etree
  2. import time
  3. import random
  4. import requests
  5. header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
  6. def processing(strs):
  7.     s = ''
  8.     for n in strs:
  9.         n = ''.join(n.split())
  10.         s = s + n
  11.     return s

  12. def get_movie_info(url):
  13.     response = requests.get(url,headers=header)
  14.     html = etree.HTML(response.text)
  15.     div_all = html.xpath('//div[@class="info"]')
  16.     url_movie = html.xpath('//div[@class="hd"]/a/@href')
  17.     for movie_url in url_movie:
  18.         # 进入每个详情页
  19.         response_movie = requests.get(movie_url, headers=header)
  20.         html_movie = etree.HTML(response_movie.text)

  21.     for div in div_all:
  22.         names = div.xpath('./div[@class="hd"]/a//span/text()')
  23.         name = processing(names)
  24.         infos = div.xpath('./div[@class="bd"]/p/text()')
  25.         info = processing(infos)
  26.         score = div.xpath('./div[@class="bd"]/div/span[2]/text()')
  27.         evaluation = div.xpath('./div[@class="bd"]/div/span[4]/text()')
  28.         url_movie = div.xpath('./div/a/@href')
  29.         summary = div.xpath('.//p[@class="quote"]/span/text()')
  30.         poster_urls = div.xpath('./div/a/img/@src')
  31.         dates = html_movie.xpath('//span[@property="v:initialReleaseDate"]/text()')
  32.         date = processing(dates)
  33.         print('电影名称:',name)
  34.         print('导演与演员:',info)
  35.         print('电影评分:',score)
  36.         print('评价人数:',evaluation)
  37.         print('电影总结:',summary)
  38.         print('电影详情页地址:', url_movie[0])
  39.         print('首次上演日期:', date)
  40.         if poster_urls:
  41.             poster_url = poster_urls[0]
  42.             print('海报封面地址:', poster_url)
  43.         print('--------分隔线--------')
  44. if __name__ == '__main__':
  45.     for i in range(0,250,25):
  46.         url = 'https://movie.douban.com/top250?start={page}&filter='.format(page=i)
  47.         get_movie_info(url)
  48.         time.sleep(random.randint(1,3))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-11 17:17:02 | 显示全部楼层
@FishC 帮我改良一下代码,需要修改的代码进行修改,并标注出来
  1. from lxml import etree
  2. import time
  3. import random
  4. import requests
  5. header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
  6. def processing(strs):
  7.     s = ''
  8.     for n in strs:
  9.         n = ''.join(n.split())
  10.         s = s + n
  11.     return s

  12. def get_movie_info(url):
  13.     response = requests.get(url,headers=header)
  14.     html = etree.HTML(response.text)
  15.     div_all = html.xpath('//div[@class="info"]')
  16.     url_movie = html.xpath('//div[@class="hd"]/a/@href')


  17.     for div in div_all:
  18.         names = div.xpath('./div[@class="hd"]/a//span/text()')
  19.         name = processing(names)
  20.         infos = div.xpath('./div[@class="bd"]/p/text()')
  21.         info = processing(infos)
  22.         score = div.xpath('./div[@class="bd"]/div/span[2]/text()')
  23.         evaluation = div.xpath('./div[@class="bd"]/div/span[4]/text()')
  24.         url_movie = div.xpath('./div/a/@href')
  25.         summary = div.xpath('.//p[@class="quote"]/span/text()')
  26.         poster_urls = div.xpath('./div/a/img/@src')
  27.         for movie_url in url_movie:
  28.             # 进入每个详情页
  29.             response_movie = requests.get(movie_url, headers=header)
  30.             html_movie = etree.HTML(response_movie.text)
  31.         dates = html_movie.xpath('//span[@property="v:initialReleaseDate"]/text()')
  32.         date = processing(dates)
  33.         print('电影名称:',name)
  34.         print('导演与演员:',info)
  35.         print('电影评分:',score)
  36.         print('评价人数:',evaluation)
  37.         print('电影总结:',summary)
  38.         print('电影详情页地址:', url_movie[0])
  39.         print('首次上演日期:', date)
  40.         if poster_urls:
  41.             poster_url = poster_urls[0]
  42.             print('海报封面地址:', poster_url)
  43.         print('--------分隔线--------')
  44. if __name__ == '__main__':
  45.     for i in range(0,250,25):
  46.         url = 'https://movie.douban.com/top250?start={page}&filter='.format(page=i)
  47.         get_movie_info(url)
  48.         time.sleep(random.randint(1,3))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-11 19:11:00 | 显示全部楼层
@Fishc 代码中有一些问题,你可以帮我解决吗。问题如下:
1.无法完全爬取250部电影
2.有些电影的首次上映日期无法爬取
3.每部电影都有海报封面地址,在电影详情页当中,但是我找不到
你可以帮我解决这些问题吗
  1. import random
  2. import requests
  3. from lxml import etree
  4. import time

  5. def processing(strs):
  6.     return ''.join([n.strip() for n in strs])

  7. def get_movie_info(url):
  8.     header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
  9.     response = requests.get(url,headers=header)
  10.     html = etree.HTML(response.text)
  11.     div_all = html.xpath('//div[@class="info"]')
  12.     url_movie = html.xpath('//div[@class="hd"]/a/@href')

  13.     for div in div_all:
  14.         names = div.xpath('./div[@class="hd"]/a//span/text()')
  15.         name = processing(names)
  16.         infos = div.xpath('./div[@class="bd"]/p/text()')
  17.         info = processing(infos)
  18.         score = div.xpath('./div[@class="bd"]/div/span[2]/text()')
  19.         evaluation = div.xpath('./div[@class="bd"]/div/span[4]/text()')
  20.         summary = div.xpath('.//p[@class="quote"]/span/text()')
  21.         poster_urls = div.xpath('./div/a/img/@src')
  22.         url_movie = div.xpath('./div/a/@href')
  23.         for movie_url in url_movie:
  24.             response_movie = requests.get(movie_url, headers=header)
  25.             html_movie = etree.HTML(response_movie.text)
  26.         dates = html_movie.xpath('//span[@property="v:initialReleaseDate"]/text()')
  27.         date = processing(dates)
  28.         print('电影名称:',name)
  29.         print('导演与演员:',info)
  30.         print('电影评分:',score)
  31.         print('评价人数:',evaluation)
  32.         print('电影总结:',summary)
  33.         print('首次上映日期:', date)
  34.         print('电影详情页地址:', url_movie[0])
  35.         print('海报封面地址:',)
  36.         print('--------分隔线--------')
  37. if __name__ == '__main__':
  38.     for i in range(0,250,25):
  39.         url = 'https://movie.douban.com/top250?start={page}&filter='.format(page=i)
  40.         get_movie_info(url)
  41.         time.sleep(random.randint(1,3))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-11 19:13:25 | 显示全部楼层
FishC 发表于 2023-12-11 19:11
问题1:无法完全爬取250部电影
这是因为你的代码中只爬取了每页的前10部电影。在`get_movie_info`函数中 ...

你可以给我一份完整的代码吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-11 19:14:28 | 显示全部楼层
FishC 发表于 2023-12-11 19:11
问题1:无法完全爬取250部电影
这是因为你的代码中只爬取了每页的前10部电影。在`get_movie_info`函数中 ...

你可以给我一份完整的代码吗,最好是简洁美观
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-12 10:58:55 | 显示全部楼层
FishC 发表于 2023-12-11 19:23
当然可以!下面是经过修改的完整代码:

@FishC 爬取的数据中“导演与演员”这一行出现问题,你可以帮我解决这个数据不对齐的问题吗
  1. 电影名称: 肖申克的救赎 / The Shawshank Redemption
  2. 导演与演员:
  3.                             导演: 弗兰克·德拉邦特 Frank Darabont   主演: 蒂姆·罗宾斯 Tim Robbins /...
  4.                             1994 / 美国 / 犯罪 剧情
  5.                         
  6.                                 
  7.                            
  8. 电影评分: ['9.7']
  9. 评价人数: ['2955194人评价']
  10. 电影总结: ['希望让人自由。']
  11. 首次上映日期: 1994-09-10(多伦多电影节)1994-10-14(美国)
  12. 电影详情页地址: https://movie.douban.com/subject/1292052/
  13. 海报封面地址: ['https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg']
  14. --------分隔线--------
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-12 14:29:45 | 显示全部楼层
FishC 发表于 2023-12-12 11:08
这个问题是因为导演与演员那一行的数据前面有一些空格和制表符导致的。我们可以使用字符串的strip()方法 ...

还有其他方法吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-12 15:27:35 | 显示全部楼层
@Fishic 可以帮我检查一下代码吗,爬取出来的数据看起来不美观,你有办法解决吗,请返回完整的代码
  1. import random
  2. import requests
  3. from lxml import etree
  4. import time
  5. def processing(strs):
  6.     return ''.join(strs)
  7. def get_movie_info(url):
  8.     header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
  9.     response = requests.get(url, headers=header)
  10.     html = etree.HTML(response.text)
  11.     div_all = html.xpath('//div[@class="info"]')
  12.     for div in div_all:
  13.         names = div.xpath('.//span[@class="title"]/text()')
  14.         name = processing(names)
  15.         infos = div.xpath('.//div[@class="bd"]/p/text()')
  16.         info = processing(infos)
  17.         score = div.xpath('.//span[@class="rating_num"]/text()')
  18.         evaluation = div.xpath('.//div[@class="star"]/span[4]/text()')
  19.         summary = div.xpath('.//span[@class="inq"]/text()')
  20.         url_movie = div.xpath('.//a/@href')
  21.         for movie_url in url_movie:
  22.             response_movie = requests.get(movie_url, headers=header)
  23.             html_movie = etree.HTML(response_movie.text)
  24.             dates = html_movie.xpath('//span[@property="v:initialReleaseDate"]/text()')
  25.             date = processing(dates)
  26.             poster_urls = html_movie.xpath('//img[@rel="v:image"]/@src')
  27.             print('电影名称:', name)
  28.             print('导演与演员:', info)
  29.             print('电影评分:', score)
  30.             print('评价人数:', evaluation)
  31.             print('电影总结:', summary)
  32.             print('首次上映日期:', date)
  33.             print('电影详情页地址:', movie_url)
  34.             print('海报封面地址:', poster_urls)
  35.             print('--------分隔线--------')
  36. if __name__ == '__main__':
  37.     for i in range(0, 250, 25):
  38.         url = 'https://movie.douban.com/top250?start={page}&filter='.format(page=i)
  39.         get_movie_info(url)
  40.         time.sleep(random.randint(1, 3))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-13 14:22:07 | 显示全部楼层
@Fishc 你可以对代码进行美化吗,让代码看起来更加易于阅读,更具有观赏性,但是不能大幅度的修改原有的代码,代码如下
  1. import random
  2. import requests
  3. from lxml import etree
  4. import time

  5. def processing(strs):
  6.     s = ''
  7.     for n in strs:
  8.         n = ''.join(n.split())
  9.         s = s + n
  10.     return s

  11. def get_movie_info(url):
  12.     header = {
  13.         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
  14.     response = requests.get(url, headers=header)
  15.     html = etree.HTML(response.text)
  16.     div_all = html.xpath('//div[@class="info"]')
  17.     for div in div_all:
  18.         names = div.xpath('./div[@class="hd"]/a//span/text()')
  19.         name = processing(names)
  20.         infos = div.xpath('.//div[@class="bd"]/p/text()')
  21.         info = processing(infos)
  22.         score = div.xpath('.//span[@class="rating_num"]/text()')
  23.         evaluation = div.xpath('.//div[@class="star"]/span[4]/text()')
  24.         summary = div.xpath('.//span[@class="inq"]/text()')
  25.         url_movie = div.xpath('.//a/@href')
  26.         for movie_url in url_movie:
  27.             response_movie = requests.get(movie_url, headers=header)
  28.             html_movie = etree.HTML(response_movie.text)
  29.             dates = html_movie.xpath('//span[@property="v:initialReleaseDate"]/text()')
  30.             date = processing(dates)
  31.             poster_urls = html_movie.xpath('//img[@rel="v:image"]/@src')
  32.             with open('豆瓣Top250信息.txt', 'a', encoding='utf-8') as file:
  33.                 file.write(f"电影名称: {name}\n")
  34.                 file.write(f"导演与演员: {info}\n")
  35.                 file.write(f"电影评分: {score}\n")
  36.                 file.write(f"评价人数: {evaluation}\n")
  37.                 file.write(f"电影总结: {summary}\n")
  38.                 file.write(f"首次上映日期: {date}\n")
  39.                 file.write(f"电影详情页地址: {movie_url}\n")
  40.                 file.write(f"海报封面地址: {poster_urls}\n")
  41.                 file.write("------------------分隔线------------------\n")
  42.                 file.write('\n')
  43.             print(f"电影名称: {name}")
  44.             print(f"导演与演员: {info}")
  45.             print(f"电影评分: {score}")
  46.             print(f"评价人数: {evaluation}")
  47.             print(f"电影总结: {summary}")
  48.             print(f"首次上映日期: {date}")
  49.             print(f"电影详情页地址: {movie_url}")
  50.             print(f"海报封面地址: {poster_urls}")
  51.             print("------------------分隔线------------------")
  52.             print()

  53. if __name__ == '__main__':

  54.     for i in range(0, 250, 25):
  55.         url = 'https://movie.douban.com/top250?start={page}&filter='.format(page=i)
  56.         get_movie_info(url)
  57.         time.sleep(random.randint(1, 3))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-14 16:48:14 | 显示全部楼层
@FishC 你可以帮我解决代码中的乱码问题吗

  1. import javax.swing.*;
  2. import javax.swing.colorchooser.DefaultColorSelectionModel;
  3. import java.awt.*;
  4. import java.awt.event.*;
  5. import java.io.*;

  6. public class Txt extends JFrame implements ActionListener{
  7.     private StringBuilder ss=new StringBuilder();

  8.     private JMenuBar jm1=new JMenuBar();                      //�����˵�������Ӧ�˵���
  9.     private JMenu jme1=new JMenu("�ļ�(F)");
  10.     private JMenuItem jm3=new JMenuItem("�½�(N)                 ");
  11.     private JMenuItem jm4=new JMenuItem("�´���(W)      ");
  12.     private JMenuItem jm5=new JMenuItem("��(O)...          ");
  13.     private JMenuItem jm6=new JMenuItem("����(S)            ");
  14.     private JMenuItem jm7=new JMenuItem("���Ϊ(A)       ");
  15.     private JMenuItem jm8=new JMenuItem("�˳�(X)");

  16.     private JMenu jme2=new JMenu("��ʽ(O)");
  17.     private JMenuItem jm9=new JMenuItem("�Զ�����(W)");

  18.     private JMenu jme3=new JMenu("��ɫ(C)");
  19.     private JMenuItem jm10=new JMenuItem("������ɫ(C)");

  20.     private JMenu jme4=new JMenu("����(H)");
  21.     private JMenuItem jm11=new JMenuItem("�鿴����(H)");


  22.     private DefaultColorSelectionModel modle=new DefaultColorSelectionModel();   //Ĭ����ɫѡ��ģ��
  23.     private  JColorChooser jcc=new JColorChooser(modle);
  24.     private JFileChooser jfc=new JFileChooser(new File(""));


  25.     private JTextArea jt=new JTextArea(10,30);
  26.     private JScrollPane jsp=new JScrollPane(jt);
  27.     private Font font=new Font("����",0,22);

  28.     Txt()
  29.     {
  30.         super("���±�");   //���ÿ�ܱ���

  31.         add(jm1,BorderLayout.NORTH);
  32.         add(jsp,BorderLayout.CENTER);

  33.         jt.setLayout(null);
  34.         jt.setFont(font);

  35.         jm1.add(jme1);jm1.add(jme2);jm1.add(jme3);jm1.add(jme4);         //����Ӧ�˵�ѡ������Ӧ�˵���

  36.         jme1.add(jm3);jme1.add(jm4);jme1.add(jm5);jme1.add(jm6);
  37.         jme1.add(jm7);jme1.addSeparator();
  38.         jme1.addSeparator();jme1.add(jm8);

  39.         jme2.add(jm9);
  40.         jme3.add(jm10);
  41.         jme4.add(jm11);

  42.         jme1.setMnemonic('F');   //mnemonic n/���Ƿ� adj.�����  �������Ƿ�����alt+�ַ� �򿪶�Ӧ�˵���
  43.         jme2.setMnemonic('O');
  44.         jme3.setMnemonic('C');
  45.         jme4.setMnemonic('H');

  46.         jm3.setMnemonic('N');
  47.         jm4.setMnemonic('W');
  48.         jm5.setMnemonic('O');
  49.         jm6.setMnemonic('S');
  50.         jm7.setMnemonic('A');
  51.         jm8.setMnemonic('X');
  52.         jm9.setMnemonic('W');
  53.         jm10.setMnemonic('C');

  54.         //���ÿ�ݼ�������Ӧ��ݼ�������Ӧ����
  55.         jm3.setAccelerator((KeyStroke.getKeyStroke(KeyEvent.VK_W,ActionEvent.CTRL_MASK)));
  56.         jm4.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,ActionEvent.CTRL_MASK+ActionEvent.SHIFT_MASK));
  57.         jm5.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,ActionEvent.CTRL_MASK));
  58.         jm6.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,ActionEvent.CTRL_MASK));
  59.         jm7.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,ActionEvent.CTRL_MASK+ActionEvent.SHIFT_MASK));
  60.         jm8.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,ActionEvent.CTRL_MASK));
  61.         jm10.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,ActionEvent.CTRL_MASK+ActionEvent.SHIFT_MASK));

  62.         jm3.addActionListener(new ActionListener() {               //���������ڲ������ʽ��д�¼�����
  63.             @Override
  64.             public void actionPerformed(ActionEvent e) {
  65.                 jt.setText("");
  66.                 setTitle("�ޱ���-���±�");
  67.             }
  68.         });
  69.         jm4.addActionListener(new ActionListener() {
  70.             @Override
  71.             public void actionPerformed(ActionEvent e) {
  72.                 Txt t1=new Txt();
  73.                 t1.setTitle("�ޱ���-���±�");
  74.             }
  75.         });
  76.         jm8.addActionListener(new ActionListener() {
  77.             @Override
  78.             public void actionPerformed(ActionEvent e) {
  79.                 System.exit(0);
  80.             }
  81.         });
  82.         jm11.addActionListener(new ActionListener() {
  83.             @Override
  84.             public void actionPerformed(ActionEvent e) {
  85.                 JOptionPane.showMessageDialog(Txt.this,"��ͬ�ɳ�����","����",JOptionPane.PLAIN_MESSAGE);
  86.             }
  87.         });

  88.         jm5.addActionListener(this);     //�Բ˵�����Ӽ���
  89.         jm7.addActionListener(this);
  90.         jm8.addActionListener(this);
  91.         jm6.addActionListener(this);
  92.         jm9.addActionListener(this);
  93.         jm10.addActionListener(this);

  94.         setBounds(700,250,700,700);
  95.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  96.         setVisible(true);
  97.     }

  98.     public static void main(String[] args) {      //������
  99.         Txt t=new Txt();
  100.     }

  101.     public void actionPerformed(ActionEvent e)
  102.     {

  103.         if(e.getActionCommand().equals("��(O)...          "))           //���ļ�
  104.         {
  105.             int open=jfc.showOpenDialog(this);
  106.             if(open!=JFileChooser.APPROVE_OPTION)
  107.             {}
  108.             else
  109.             {
  110.                 try{
  111.                     File f=jfc.getSelectedFile();
  112.                     ss.append(f.getAbsolutePath());
  113.                     FileReader fr=new FileReader(f);

  114.                     BufferedReader br=new BufferedReader(fr);
  115.                     StringBuilder info=new StringBuilder();
  116.                     String str;
  117.                     while((str=br.readLine())!=null) {info.append(str+"\r\n");}
  118.                     jt.setText(String.valueOf(info));
  119.                     br.close();
  120.                 }catch (IOException ioe){}
  121.             }
  122.         }
  123.         else if(e.getActionCommand().equals("���Ϊ(A)       "))             //�洢�ļ�
  124.         {
  125.             int save=jfc.showSaveDialog(this);
  126.             if(save==JFileChooser.APPROVE_OPTION)
  127.             {
  128.                 try{
  129.                     File f2=jfc.getSelectedFile();
  130.                     FileWriter fw=new FileWriter(f2);                 //�ڶ��ִ�ʩ
  131.                     String str=jt.getText();
  132.                     fw.write(str);
  133.                     fw.close();

  134.                 }catch (IOException io){System.out.println(io.getMessage());}
  135.             }
  136.         }
  137.         else if(e.getActionCommand().equals("����(S)            "))          //�����ļ�
  138.         {
  139.             if(this.getTitle()=="�ޱ���-���±�") {
  140.                 int save=jfc.showSaveDialog(this);
  141.                 if(save==JFileChooser.APPROVE_OPTION)
  142.                     try {
  143.                         File f2 = jfc.getSelectedFile();
  144.                         FileWriter fw = new FileWriter(f2);                 //�ڶ��ִ�ʩ
  145.                         String str = jt.getText();
  146.                         fw.write(str);
  147.                         fw.close();
  148.                     }catch (IOException i){}
  149.             }
  150.             else {
  151.                 try {

  152.                     String str = jt.getText();
  153.                     FileWriter ra=new FileWriter(String.valueOf(ss));
  154.                     ra.write(str);
  155.                     ra.close();
  156.                 }catch (IOException i){System.out.println(i.getMessage());}
  157.             } }
  158.         else if(e.getActionCommand().equals("�Զ�����(W)"))             //�����ı��Ƿ��Զ�����
  159.         {
  160.             boolean b=!(jt.getLineWrap());
  161.             jt.setLineWrap(b);
  162.         }
  163.         else if(e.getActionCommand().equals("������ɫ(C)"))               //�ı�������ɫ
  164.         {
  165.             Color color=jcc.getColor();
  166.             Color c=JColorChooser.showDialog(this,"��ɫѡ��",color);
  167.             jt.setForeground(c);
  168.         } }}
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-14 16:52:25 | 显示全部楼层
@FishC 你可以用java来实现这个要求吗
要求如下
1. 设计一个图形界面(GUI)的计算器应用程序,完成简单的算术运算、
2.设计的计算器应用程序可以完成家法、减法、乘法、除法和取余运算。且有小数点、正负号、求倒数、退格和清零功能。
3.本应用程序继承自框架类(Frame),此程序使用Frame布局管理器BorderLayout,将单行文本框加入到“North”区域,包含各种按钮的面板Panel p加入到”Center”区域。         包含各种按钮的面板Panel p 采用4行5列的网格布局,然后将数字按钮和运算符按钮以及控制按钮添加到面板中。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-1 20:00:16 | 显示全部楼层
@FishC 你可以帮我看看这段代码有什么问题吗,好像不能爬取完整的top250的电影信息
  1. import random
  2. import requests
  3. import time
  4. from lxml import etree

  5. def processing(strs):
  6.     s = ''
  7.     for n in strs:
  8.         n = ''.join(n.split())
  9.         s = s + n
  10.     return s

  11. def get_movie_info(url):
  12.     header = {
  13.         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
  14.     response = requests.get(url, headers=header)
  15.     html = etree.HTML(response.text)
  16.     div_all = html.xpath('//div[@class="info"]')

  17.     for div in div_all:
  18.         names = div.xpath('./div[@class="hd"]/a//span/text()')
  19.         name = processing(names)

  20.         infos = div.xpath('.//div[@class="bd"]/p/text()')
  21.         info = processing(infos)

  22.         score = div.xpath('.//span[@class="rating_num"]/text()')
  23.         evaluation = div.xpath('.//div[@class="star"]/span[4]/text()')
  24.         summary = div.xpath('.//span[@class="inq"]/text()')
  25.         url_movie = div.xpath('.//a/@href')

  26.         for movie_url in url_movie:
  27.             response_movie = requests.get(movie_url, headers=header)
  28.             html_movie = etree.HTML(response_movie.text)
  29.             dates = html_movie.xpath('//span[@property="v:initialReleaseDate"]/text()')
  30.             date = processing(dates)
  31.             poster_urls = html_movie.xpath('//img[@rel="v:image"]/@src')

  32.             with open('豆瓣Top250信息.txt', 'a', encoding='utf-8') as file:
  33.                 file.write(f"电影名称: {name}\n")
  34.                 file.write(f"导演与演员: {info}\n")
  35.                 file.write(f"电影评分: {score}\n")
  36.                 file.write(f"评价人数: {evaluation}\n")
  37.                 file.write(f"电影总结: {summary}\n")
  38.                 file.write(f"首次上映日期: {date}\n")
  39.                 file.write(f"电影详情页地址: {movie_url}\n")
  40.                 file.write(f"海报封面地址: {poster_urls}\n")
  41.                 file.write("------------------分隔线------------------\n")
  42.                 file.write('\n')

  43.             print(f"电影名称: {name}")
  44.             print(f"导演与演员: {info}")
  45.             print(f"电影评分: {score}")
  46.             print(f"评价人数: {evaluation}")
  47.             print(f"电影总结: {summary}")
  48.             print(f"首次上映日期: {date}")
  49.             print(f"电影详情页地址: {movie_url}")
  50.             print(f"海报封面地址: {poster_urls}")
  51.             print("------------------分隔线------------------")
  52.             print()


  53. if __name__ == '__main__':
  54.     for i in range(0, 250, 25):
  55.         url = 'https://movie.douban.com/top250?start={page}&filter='.format(page=i)
  56.         get_movie_info(url)
  57.         time.sleep(random.randint(1, 3))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-21 11:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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