python爬虫系列案例1-抓取猫眼电影top100(读取-解析-存储)

案例:抓取猫眼电影top100
要求:

  1. 获取电影相关信息
  2. 存储在mysql表单中

知识点:

  1. requests请求读取
  2. 正则表达式re解析网页
  3. pymysql存储网页内容
# url:http://maoyan.com/board
# 排名,海报,影名,主演,上映时间,评分
# 存储,mysql
# 模块:pymysql+requests+re(一个正则就可以把上述都可以整出来)

# 第二步:分析html结构
# 第三步:代码写入

import re
import pymysql
import requests



# (1)请求一个单页的内容
def get_one_page(url):
    headers = {
        "Host": "maoyan.com",
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36"}
    response = requests.get(url, headers=headers)
    return response.text


# (2)解析单页的html
def parse_one_page(html):
    # 制定规则,正则表达式
    #re.S可以匹配到换行符


    pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
                         + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
                         + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
    items=re.findall(pattern,html)
    #print(items)
# (3)处理单页的数据
    for item in items:
        yield {
            "index":item[0],
            "image":item[1],
            "title":item[2],
            "actor":item[3].strip()[3:],
            "time":item[4].strip()[5:],
            "score":item[5]+item[6]
        }



# (4)保存单页的数据
def write_to_mysql(content):
    #连接数据库
    conn=pymysql.connect(host="localhost",user="root",passwd="8642807",db="16ban",charset="utf8")
    #创建游标
    cursor=conn.cursor()
    index=content["index"]
    image=content["image"]
    title = content['title']
    actor = content['actor']
    time = content['time']
    score = content['score']
    #构建sql语句和数据源
    sql="insert into maoyan values(%s,%s,%s,%s,%s,%s)"
    parm=(index,image,title,actor,time,score)
    #执行sql语句
    cursor.execute(sql,parm)
    #提交
    conn.commit()
    #关闭
    cursor.close()
    conn.close()
# (5)函数回调
def main(num):
    #重构url
    url = "http://maoyan.com/board/4?offset="+str(num)
    html=get_one_page(url)
    for i in parse_one_page(html):
         print(i)
         write_to_mysql(i)



# (6)分页处理
#程序入口,不能被外部调用
if __name__=="__main__":
    for i in range(10):
         main(i*10)

猜你喜欢

转载自blog.csdn.net/qq_42787271/article/details/81740083