• 5.2 Ajax 数据爬取实战


    目录

    1. 实战内容

    2、Ajax 分析

    3、爬取内容

    4、存入MySQL 数据库

    4.1 创建相关表

    4.2 数据插入表中

    5、总代码与结果


    1. 实战内容

            爬取Scrape | Movie的所有电影详情页的电影名、类别、时长、上映地及时间、简介、评分,并将这些内容存入MySQL数据库中。

    2、Ajax 分析

            根据上一篇文章5.1 Ajax数据爬取之初介绍-CSDN博客,找到详情页的数据包,如下:

            根据数据包,会发现其中 Response中有我们想要的内容。查看其及其他页的Request URL,发现其规律,只需改变后面的数字,构造链接,即可一一爬取信息。

            Response中想要的内容如下(为Response部分内容截图):

            等等,不难发现此内容以字典的形式呈现在我们眼前。

    3、爬取内容

            所以用 eval() 将字符串形式的 content 转换为字典,方便提取信息。将提取的信息汇合成字典,便于传递、存入MySQL数据库

            在爬取的过程中,会发现一些电影数据不完整,会造成错误使得程序崩溃,所以使用try...except...去避免。

    1. import requests
    2. def crawler(url):
    3. response = requests.get(url)
    4. content = response.text
    5. content = eval(content)
    6. name = content['name']
    7. alias = content['alias'] # 外文名
    8. categories = content['categories']
    9. cate = ','.join(categories) # 电影种类
    10. regions = content['regions']
    11. region = ','.join(regions) # 地点
    12. publish_time = content['published_at']
    13. score = content['score']
    14. minute = content['minute'] # 时长
    15. drama = content['drama']
    16. # print(name, alias, cate, region, publish_time, score, minute, drama)
    17. movie_dict = {
    18. 'name': name,
    19. 'alias': alias,
    20. 'cate': cate,
    21. 'region': region,
    22. 'publish_time':publish_time,
    23. 'minute': minute,
    24. 'score': score,
    25. 'drama': drama
    26. }
    27. print(movie_dict)
    28. if __name__ == '__main__':
    29. last = 100
    30. for i in range(1, last+1):
    31. url = f'https://spa1.scrape.center/api/movie/{i}/'
    32. try:
    33. crawler(url)
    34. except NameError:
    35. print(f'链接{url}数据不完整')

            以第一个详情页为例子展现输出结果:

            之后,我们可以根据结果存入MySQL数据库。

    4、存入MySQL 数据库

    4.1 创建相关表

            要存入数据库前,要根据字典的键创建相关表,之后才能存入表中。创建表可以在爬取数据之前创建,不需要每次循环创建一次。

            相关代码见 create_table() 函数,**mysql_local 用法见上一篇文章5.1 Ajax数据爬取之初介绍-CSDN博客 

    1. def creat_table():
    2. conn = pymysql.connect(**mysql_local)
    3. cursor = conn.cursor()
    4. sql = ('CREATE TABLE IF NOT EXISTS movie(id INT AUTO_INCREMENT PRIMARY KEY,'
    5. 'name VARCHAR(100) ,'
    6. 'alias VARCHAR(100) ,'
    7. 'cate VARCHAR(100) ,'
    8. 'region VARCHAR(100) ,'
    9. 'publish_time DATE,'
    10. 'minute VARCHAR(100),'
    11. 'score VARCHAR(100),'
    12. 'drama TEXT)') # 文本内容
    13. cursor.execute(sql)
    14. conn.close()

            sql语句创建表具体可见4.4 MySQL存储-CSDN博客

    4.2 数据插入表中

            使用 insert_movie() 函数插入字典数据,具体解析可见4.4 MySQL存储-CSDN博客

    1. def insert_movie(movie_dict):
    2. conn = pymysql.connect(**mysql_local)
    3. cursor = conn.cursor()
    4. keys = ','.join(movie_dict.keys())
    5. values = ','.join(['%s'] * len(movie_dict))
    6. sql = f'INSERT INTO movie({keys}) VALUES ({values})'
    7. # print(sql)
    8. # print(tuple(movie_dict.values()))
    9. cursor.execute(sql, tuple(movie_dict.values()))
    10. conn.commit()
    11. conn.close()

    5、总代码与结果

    1. import requests
    2. import pymysql
    3. from mysql_info import mysql_local
    4. def creat_table():
    5. conn = pymysql.connect(**mysql_local)
    6. cursor = conn.cursor()
    7. sql = ('CREATE TABLE IF NOT EXISTS movie(id INT AUTO_INCREMENT PRIMARY KEY,'
    8. 'name VARCHAR(100) ,'
    9. 'alias VARCHAR(100) ,'
    10. 'cate VARCHAR(100) ,'
    11. 'region VARCHAR(100) ,'
    12. 'publish_time DATE,'
    13. 'minute VARCHAR(100),'
    14. 'score VARCHAR(100),'
    15. 'drama TEXT)')
    16. cursor.execute(sql)
    17. conn.close()
    18. def insert_movie(movie_dict):
    19. conn = pymysql.connect(**mysql_local)
    20. cursor = conn.cursor()
    21. keys = ','.join(movie_dict.keys())
    22. values = ','.join(['%s'] * len(movie_dict))
    23. sql = f'INSERT INTO movie({keys}) VALUES ({values})'
    24. # print(sql)
    25. # print(tuple(movie_dict.values()))
    26. cursor.execute(sql, tuple(movie_dict.values()))
    27. conn.commit()
    28. conn.close()
    29. def crawler(url):
    30. response = requests.get(url)
    31. content = response.text
    32. content = eval(content)
    33. # id = content['id']
    34. name = content['name']
    35. alias = content['alias'] # 外文名
    36. categories = content['categories']
    37. cate = ','.join(categories)
    38. regions = content['regions']
    39. region = ','.join(regions)
    40. publish_time = content['published_at']
    41. score = content['score']
    42. minute = content['minute']
    43. drama = content['drama']
    44. # print(name, alias, cate, region, publish_time, score, minute, drama)
    45. movie_dict = {
    46. # 'id': id,
    47. 'name': name,
    48. 'alias': alias,
    49. 'cate': cate,
    50. 'region': region,
    51. 'publish_time':publish_time,
    52. 'minute': minute,
    53. 'score': score,
    54. 'drama': drama
    55. }
    56. # print(movie_dict)
    57. insert_movie(movie_dict)
    58. if __name__ == '__main__':
    59. creat_table()
    60. last = 100
    61. for i in range(1, last+1):
    62. url = f'https://spa1.scrape.center/api/movie/{i}/'
    63. try:
    64. crawler(url)
    65. except NameError:
    66. print(f'链接{url}数据不完整')

    mysql数据库部分内容:

    本人新手,若有错误,欢迎指正;若有疑问,欢迎讨论。若文章对你有用,点个小赞鼓励一下,谢谢,一起加油吧!

  • 相关阅读:
    4-7:用Redis优化登陆模块
    pytest(9)-标记用例(指定执行、跳过用例、预期失败)
    百篇博客 · 千里之行
    2003-2022年飞机航线信息数据
    C#使用Objects Comparer进行对象比较
    小谈设计模式(17)—状态模式
    IntelliJ IDEA一站式配置【全】(提高开发效率)
    iNFTnews | 元宇宙的欢乐世界:别开生面的游戏、音乐会、主题公园和电影
    猿创征文| 动规了解
    JS(javascript)面试题 7点一次过 => 必会之八股文
  • 原文地址:https://blog.csdn.net/weixin_51100340/article/details/136271592