鱼C论坛

 找回密码
 立即注册
查看: 1618|回复: 2

[作品展示] 比葫芦画瓢写的电影信息爬取的代码并保存到数据库

[复制链接]
发表于 2023-7-6 17:59:06 | 显示全部楼层 |阅读模式

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

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

x
需要安装以下库:
pymongo  requests  re  pyquery urllib logging

  1. import pymongo
  2. import requests
  3. import re
  4. from pyquery import PyQuery as pq
  5. from urllib.parse import urljoin
  6. import logging

  7. logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s:%(message)s')

  8. BASE_URL = 'https://ssr1.scrape.center'
  9. TOTAL_PAGE = 10

  10. def scrape_page(url):
  11.     logging.info('scraping %s...', url)
  12.     try:
  13.         response = requests.get(url)
  14.         if response.status_code == 200:
  15.             return response.text
  16.         logging.error('get invalid status code %s while scraping %s', response.status_code, url)
  17.     except requests.RequestException:
  18.         logging.error('error occurred while scraping %s', url, exc_info=True)

  19. def scrape_index(page):
  20.     index_url = f'{BASE_URL}/page/{page}'
  21.     return scrape_page(index_url)

  22. def parse_index(html):
  23.     doc = pq(html)
  24.     links = doc('.el-card .name')
  25.     for link in links.items():
  26.         href = link.attr('href')
  27.         detail_url = urljoin(BASE_URL, href)
  28.         logging.info('get detail url %s', detail_url)
  29.         yield detail_url



  30. def scrape_detail(url):
  31.     return scrape_page(url)

  32. def parse_detail(html):
  33.     doc = pq(html)
  34.     cover = doc('img.cover').attr('src')
  35.     name = doc('a > h2').text()
  36.     categories = [item.text() for item in doc('.categories button span').items()]
  37.     published_at = doc('.info:contains(上映)').text()
  38.     published_at = re.search('(\d{4}-\d{2}-\d{2})', published_at).group(1) \
  39.         if published_at and re.search('\d{4}-\d{2}-\d{2}', published_at) else None
  40.     drama = doc('.drama p').text()
  41.     score = doc('p.score').text()
  42.     score = float(score) if score else None
  43.     return {
  44.         'cover': cover,
  45.         'name': name,
  46.         'categories': categories,
  47.         'published_at': published_at,
  48.         'drama': drama,
  49.         'score': score
  50. }



  51. client = pymongo.MongoClient(host='localhost', port=27017)
  52. db = client.movies
  53. collection = db.movies_mes

  54. def save_data(data):
  55.     collection.update_one({
  56.     'name': data.get('name')
  57.     }, {
  58.     '$set': data
  59.     }, upsert=True)

  60. def main():
  61.     for page in range(1, TOTAL_PAGE + 1):
  62.         index_html = scrape_index(page)
  63.         detail_urls = parse_index(index_html)
  64.         for detail_url in detail_urls:
  65.             detail_html = scrape_detail(detail_url)
  66.             data = parse_detail(detail_html)
  67.             logging.info('get detail data %s', data)
  68.             logging.info('saving data to mongodb')
  69.             save_data(data)
  70.             logging.info('data saved successfully')

  71. if __name__ == '__main__':
  72.     main()
复制代码


以下是成功保存到数据库的界面:

微信截图_20230706175816.jpg

评分

参与人数 1荣誉 +2 贡献 +2 收起 理由
sfqxx + 2 + 2 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

发表于 2023-7-6 18:50:41 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 11:01:41 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 11:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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