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之list和str比较
Sep 20 Python
Python比较两个图片相似度的方法
Mar 13 Python
python 基础教程之Map使用方法
Jan 17 Python
Python 实现购物商城,含有用户入口和商家入口的示例
Sep 15 Python
解决Pycharm下面出现No R interpreter defined的问题
Oct 29 Python
对python数据切割归并算法的实例讲解
Dec 12 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
Mar 01 Python
基于Python2、Python3中reload()的不同用法介绍
Aug 12 Python
快速解决jupyter启动卡死的问题
Apr 10 Python
基于python代码批量处理图片resize
Jun 04 Python
Python把图片转化为pdf代码实例
Jul 28 Python
Python爬虫进阶之Beautiful Soup库详解
Apr 29 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
咖啡常见的种类
2021/03/03 新手入门
Codeigniter的一些优秀特性总结
2015/01/21 PHP
javascript编程起步(第四课)
2007/02/27 Javascript
javascript prototype,executing,context,closure
2008/12/24 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
2013/11/19 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
解析NodeJs的调试方法
2016/12/11 NodeJs
jQuery点击弹出层弹出模态框点击模态框消失代码分享
2017/01/21 Javascript
详解ECMAScript6入门--Class对象
2017/04/27 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
2020/07/29 Javascript
JavaScript如何获取一个元素的样式信息
2019/07/29 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
python实现划词翻译
2020/04/23 Python
python元组操作实例解析
2014/09/23 Python
简单理解Python中的装饰器
2015/07/31 Python
详解Python异常处理中的Finally else的功能
2017/12/29 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
对python内置map和six.moves.map的区别详解
2018/12/19 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
面向新手解析python Beautiful Soup基本用法
2020/07/11 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
Original Penguin英国官方网站:美国著名休闲时装品牌
2016/10/30 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
四年大学生活的个人自我评价
2013/12/11 职场文书
会计主管岗位职责
2014/01/03 职场文书
幸福家庭事迹材料
2014/02/03 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
校车司机安全责任书
2015/05/11 职场文书
Python编程编写完善的命令行工具
2021/09/15 Python
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript