HTTP协议与使用Python获取数据并写入MySQL

  一、Http协议

  二、Https协议

  三、使用Python获取数据

  (1)urlib

  (2)GET请求

  (3)POST请求

  四、爬取豆瓣电影实战

  1.思路

  (1)在浏览器中输入https://movie.douban.com/j/search_tags?type=movie会得到显示的电影的分类标签,下面以“热门”为例

{"tags":["热门","最新","经典","可播放","豆瓣高分","冷门佳片","华语","欧美","韩国","日本","动作","喜剧","爱情","科幻","悬疑","恐怖","成长"]}

  (2)在浏览器中输入https://movie.douban.com/进入豆瓣首页,然后下拉到“最近热门电影”,然后点击“更多”,浏览器中显示的url为https://movie.douban.com/explore#!type=movie&tag=热门&sort=recommend&page_limit=20&page_start=0,即表示热门电影的第一页中的20部影片。

  (3)下拉至底部,点击“显示更多”一下,则此时的url变为https://movie.douban.com/explore#!type=movie&tag=热门&sort=recommend&page_limit=20&page_start=20,也就表示第二页中的20部影片。

  (4)在浏览器中输入下面的url会得到20个json格式的字符串:https://movie.douban.com/j/search_subjects?type=movie&tag=热门&sort=recommend&page_limit=20&page_start=0。

  (5)针对每个url,如果返回的结果中存在数据,那么就将page_start增加20继续执行GET请求,直到不再返回数据为止。

  2.代码实现

import urllib.request
from urllib import parse
import json

# 获得全部电影标签
url = 'https://movie.douban.com/j/search_tags?type=movie'
# 需要将中文汉字转化成十六进制的形式,否则会报编码错误
print(parse.quote('热门'))
request = urllib.request.Request(url=url)
response = urllib.request.urlopen(request, timeout=20)
# 获得json形式的字符串
result = response.read()
print(result)
# 将json形式的字符串解析成字典
result = json.loads(result)
print(result)
# 将取字典的标签字段存储到列表中
tags = result['tags']
print(tags)
# 定义一个列表存储电影的基本信息
movies = []
# 分别处理每个tag
for tag in tags:
    print(tag)
    tag = parse.quote(tag)
    print(tag)
    start = 0
    # 不断请求,直到返回结果为空
    while True:
        # 拼接需要请求的url
        url = 'https://movie.douban.com/j/search_subjects?' \
              'type=movie&tag=' + tag + '&sort=recommend&page_limit=20&page_start=' + str(start)
        print(url)
        request = urllib.request.Request(url=url)
        response = urllib.request.urlopen(request, timeout=20)
        # 获得json形式的字符串
        result = response.read()
        print(result)
        # 将json形式的字符串解析成字典
        result = json.loads(result)
        print(result)
        # 将取字典的标签字段存储到列表中
        result = result['subjects']
        print(result)
        # 循环跳出条件
        if len(result) ==0:
            break
        # 将每一条记录都添加到movies列表中
        for item in result:
            movies.append(item)
        # 修改起始位置,相当于点击"显示更多"
        start += 20

print(len(movies))

 

posted @ 2018-08-10 12:17  BigJunOba  阅读(1547)  评论(0编辑  收藏  举报