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列表去重方法
Jan 17 Python
pandas.DataFrame 根据条件新建列并赋值的方法
Apr 08 Python
pytorch permute维度转换方法
Dec 14 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
Apr 18 Python
python函数的作用域及关键字详解
Aug 20 Python
Django自定义列表 models字段显示方式
Apr 03 Python
Django数据结果集序列化并展示实现过程
Apr 22 Python
python3.8.1+selenium实现登录滑块验证功能
May 22 Python
Django通过json格式收集主机信息
May 29 Python
Python为何不支持switch语句原理详解
Oct 21 Python
Pytorch 实现变量类型转换
May 17 Python
Python Pygame实战在打砖块游戏的实现
Mar 17 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 短链接算法收集与分析
2011/12/30 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
js页面跳转的常用方法整理
2013/10/18 Javascript
清除div下面的所有标签的方法
2014/02/17 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
2015/05/18 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
nodejs如何获取时间戳与时间差
2016/08/03 NodeJs
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
ng2学习笔记之bootstrap中的component使用教程
2017/03/09 Javascript
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
通过说明与示例了解js五种设计模式
2019/06/17 Javascript
JavaScript前端开发时数值运算的小技巧
2020/07/28 Javascript
使用Python写CUDA程序的方法
2017/03/27 Python
Python 查看文件的读写权限方法
2018/01/23 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
python自动发送测试报告邮件功能的实现
2019/01/22 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
2019/06/14 Python
python 画函数曲线示例
2019/12/04 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
运动会邀请函范文
2014/02/06 职场文书
小学优秀辅导员事迹材料
2014/05/11 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
检讨书范文300字
2015/01/28 职场文书
会计稽核岗位职责
2015/04/13 职场文书
网吧温馨提示
2015/07/17 职场文书
大学生党课心得体会
2016/01/07 职场文书
Navicat连接MySQL错误描述分析
2021/06/02 MySQL