python正则表达式爬取猫眼电影top100


Posted in Python onFebruary 24, 2018

用正则表达式爬取猫眼电影top100,具体内容如下

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
 
import json  # 快速导入此模块:鼠标先点到要导入的函数处,再Alt + Enter进行选择 
from multiprocessing.pool import Pool #引入进程池 
 
import requests 
import re 
import csv 
from requests.exceptions import RequestException #引入异常 
 
## 正确保存,无丢失 
 
# 请求一个页面返回响应内容 
#以《霸王别姬》为列,右击—查看元素—会显示一个网页信息 
def get_one_page(url,offset): 
 try: 
  response=requests.get(url=url,params={"offset":offset}) 
  if response.status_code==200: #由状态码判断返回结果,200表示请求成功,300,500表出错 
   return response.text #返回网页内容 
  else:return None 
 except RequestException as e: 
   return None 
 
# 解析一个页面 
def parse_one_page(html): 
 pattern = ('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a' 
       + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>' 
       + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>') 
 #写个正则,匹配所有结果。这里由上面的网页相应内容写<dd>开头,.*?匹配任意字符穿 board-index匹配标识符,类名, 
 # \d 表数字即排名,'+'表示匹配至少一个可多个数字,</i>右边结束符 
 #“?”,问号表示 非贪婪匹配,就是一旦匹配到就不在继续往后面尝试。 
 #而\(和\)分别表示匹配一个“(”和“)” 
 # re.S匹配多行 
 regex = re.compile(pattern,re.S) #一个方法,通过一个正则表达式字符串编译生成一个正则表达式对象,re.S 匹配任意字符 
 items = regex.findall(html) #以列表形式返回全部能匹配的子串. eg: re.findall(pattern, string[, flags]) 
 for item in items: #将结果以字典形式返回,键值对 
   yield{  #把这个方法变成一个生成器 
    'index':item[0], 
    'image':item[1], 
    'title':item[2], 
    'actor':item[3].strip()[3:], #用strip()去掉换行符,不想要 主演: 这三个字就用[3:]组成一个切片,name就可以将前三个字符串去掉 
    'time':get_release_time(item[4].strip()[5:]),  #去掉前五个字符 
    'area':get_release_area(item[4].strip()[5:]), 
    'score':item[5]+item[6] #将评分整数部分和小数部分结合起来 
  } 
 
''''' 
#保存到txt,会发现中文汉字变成了unic的编码,加上encoding='utf-8',ensure_ascii=False,则汉字可正常输出 
def write_to_file(content): 
 with open('result.txt','a',encoding='utf-8') as f: # 参数 a ,表示直接往后追加 
  f.write(json.dumps(content,ensure_ascii=False) +'\n') #content是一个字典的形式,用json.dumps 把它转换为字符串,再加个换行符 
  f.close()  
#json.dumps :dict 转换为 str 
#json.loads: str 转换为 dict 
''' 
'''''''' 
# 获取上映时间 <p class="releasetime">上映时间:1993-01-01(中国香港)</p> 
def get_release_time(data): 
 pattern = '^(.*?)(\(|$)' 
 regex = re.compile(pattern) 
 w = regex.search(data) 
 return w.group(1) # group(1)指的是第一个括号里的东西 
 
# 获取上映地区 
def get_release_area(data): 
 pattern = '.*\((.*)\)' #而\(和\)分别表示匹配一个 '(' 和 ')' 
 regex = re.compile(pattern) 
 w = regex.search(data) 
 if w is None: 
  return'未知' 
 return w.group(1) 
 
# 获取封面大图,不需要 
# def get_large_thumb(url): 
#  pattern = '(.*?)@.*?' 
#  regex = re.compile(pattern) 
#  w = regex.search(url) 
#  return w.group(1) 
 
# 存储数据 
def store_data(item): 
 with open('movie.csv','a',newline='',encoding='utf-8') as data_csv: 
  # dialect为打开csv文件的方式,默认是excel,delimiter="\t"参数指写入的时候的分隔符 
  csv_writer = csv.writer(data_csv) 
  csv_writer.writerow([item['index'], item['image'], item['title'], item['actor'],item['time'],item['area'],item['score']]) 
# 参数newline是用来控制文本模式之下,一行的结束字符。可以是None,'',\n,\r,\r\n等。 
''''' 
也可判断异常,一般没错 
  try: 
   csv_writer = csv.writer(data_csv) 
   csv_writer.writerow([item['index'], item['image'], item['title'], item['actor'],item['time'],item['area'],item['score']]) 
  except Exception as e: 
   print(e) 
   print(item) 
''' 
 
# 下载封面图 
#读方式打开的话,并不会新建;写方式打开的话就会新建。 r只读,w可写,a追加 
def download_thumb(title,image): 
 try: 
  response = requests.get(image) 
  # 获取二进制数据 
  with open('image/'+title+'.jpg', 'wb') as f: #将封面图保存到当前路径下的image文件夹中,图片名称为:电影名.jpg 
   f.write(response.content) 
   f.close() 
 except RequestException as e: 
  print(e) 
  pass 
 
 
# 主调度程序 
def main(): 
 # 起始URL 
 start_url = 'http://maoyan.com/board/4?' 
 for i in range(0,1000,10): 
  # 获取响应文本内容 
  html = get_one_page(url=start_url, offset=i) 
  if html is None: 
   print('链接:%s?offset=%s异常'.format(start_url,i)) 
   continue 
  for item in parse_one_page(html): 
   # print(item) 
   store_data(item) 
   # download_thumb(item['title'],item['image']) 
# 
 
if __name__=='__main__': 
 main() 
 
''''' 
if __name__=='__main__': 
 for i in range(10): 
  main(i*10) 
''' 
 
''''' 
if __name__=='__main__': 
 for i in range(10): 
  main(i*10) 
 pool=Pool() #可以提供指定数量的进程供用户调用,如果有一个新的请求被提交到进程池,进程池还没有满,就会创建新的进程来执行请求,如果满了,就先等待 
 pool.map(main,[i*10 for i in range(10)]) #将数组中的每一个元素拿出来当做函数的参数,然后创建一个个的进程,放到进程池里面去运行;第二个参数是构造一个数组,组成循环 
 #速度明显变快!1s 
'''

保存到数据库

def main(offset): 
  url='http://maoyan.com/board/4?offset='+str(offset) 
  html=get_one_page(url) 
  # for item in parse_one_page(html): 
  #   print(item['number'])  #能正确输出 , charset="utf8" 
  try: 
    conn = pymysql.connect(host='localhost', user='root', passwd=' ', port=3306,db='test1',charset="utf8",use_unicode = False ) 
    cur = conn.cursor() # 创建一个游标对象 
    for item in parse_one_page(html): 
      try: 
        # sql = "INSERT INTO movies (number,picture,title,actors,time,area,score) VALUES (%s,%s,%s,%s,%s,%s,%s)" 
        # cur.execute(sql, ( item['number'],item['picture'],item['title'],item['actors'],item['time'],item['area'],item['score'])) 
        sql = "insert into test_movies (number,picture,title,actors,time,area,score) values(%s,%s,%s,%s,%s,%s,%s)" 
        cur.execute(sql, (item['number'], item['picture'], item['title'], item['actors'], item['time'], item['area'],item['score'])) 
      except pymysql.Error as e: 
        print(e) 
      print('- - - - - 数据保存成功 - - - - -') 
    conn.commit() 
    cur.close() 
    conn.close() # 关闭数据 
  except pymysql.Error as e: 
    print("Mysql Error %d: %s" % (e.args[0], e.args[1])) 
 
 
if __name__=='__main__': 
  # 连接数据库 
  conn = pymysql.connect(host='localhost', user='root', passwd=' ', port=3306, db='test1', charset="utf8") 
  cur = conn.cursor() # 创建一个游标对象 
  cur.execute("DROP TABLE IF EXISTS test_movies") # 如果表存在则删除 
  # 创建表sql语句 
  sqlc = """CREATE TABLE test_movies( 
    number int not null primary key auto_increment, 
    picture VARCHAR(100) NOT NULL, 
    title VARCHAR(100) NOT NULL, 
    actors VARCHAR(200) NOT NULL, 
    time VARCHAR(100) NOT NULL, 
    area VARCHAR(100) , 
    score VARCHAR(50) NOT NULL 
  )""" 
  cur.execute(sqlc) # 执行创建数据表操作 
  pool=Pool() 
  pool.map(main,[i*10 for i in range(10)])

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python网络爬虫之如何伪装逃过反爬虫程序的方法
Nov 23 Python
python write无法写入文件的解决方法
Jan 23 Python
由面试题加深对Django的认识理解
Jul 19 Python
Flask之pipenv虚拟环境的实现
Nov 26 Python
Python warning警告出现的原因及忽略方法
Jan 31 Python
python range实例用法分享
Feb 06 Python
PyTorch加载自己的数据集实例详解
Mar 18 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
Jul 03 Python
python爬虫使用requests发送post请求示例详解
Aug 05 Python
Python面向对象多态实现原理及代码实例
Sep 16 Python
python 制作磁力搜索工具
Mar 04 Python
python人工智能human learn绘图可创建机器学习模型
Nov 23 Python
python爬虫获取淘宝天猫商品详细参数
Jun 23 #Python
python按综合、销量排序抓取100页的淘宝商品列表信息
Feb 24 #Python
python2.7+selenium2实现淘宝滑块自动认证功能
Feb 24 #Python
Python 中Pickle库的使用详解
Feb 24 #Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
Feb 24 #Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 #Python
Python3实现带附件的定时发送邮件功能
Dec 22 #Python
You might like
php绘制一个扇形的方法
2015/01/24 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
2019/02/27 PHP
弹出广告特效(一个IP只弹出一次)的代码
2007/07/27 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
2013/11/08 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
2013/12/25 Javascript
提取jquery的ready()方法单独使用示例
2014/03/25 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
2015/12/30 Javascript
Bootstrap carousel轮转图的使用实例详解
2016/05/17 Javascript
javascript 用函数实现继承详解
2016/05/28 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
python自动化测试实例解析
2014/09/28 Python
用Python中的wxPython实现最基本的浏览器功能
2015/04/14 Python
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
CSS3制作半透明边框(Facebox)类似渐变
2012/12/09 HTML / CSS
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
神路信息Java面试题目
2013/03/31 面试题
经典c++面试题六
2012/01/18 面试题
自我鉴定书范文
2013/10/02 职场文书
在职研究生自我鉴定
2013/10/16 职场文书
幼儿园社区活动总结
2014/07/07 职场文书
讲文明懂礼貌演讲稿
2014/09/11 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
军训阅兵新闻稿
2015/07/17 职场文书
2019朋友新婚祝福语精选
2019/10/10 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android