#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 日志管理
import logging
import sys
reload(sys)
sys.setdefaultencoding('utf-8') def getlogger(logName, logFile): logger=logging.getLogger(logName)
logger.setLevel(logging.DEBUG) screenHandle = logging.StreamHandler()
screenHandle.setLevel(logging.DEBUG) fileHandle = logging.FileHandler(logFile,'a')
fileHandle.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') screenHandle.setFormatter(formatter)
fileHandle.setFormatter(formatter) logger.addHandler(fileHandle)
logger.addHandler(screenHandle) return logger

mysql.conf

[mysql]
user=你的root
password=你的password
database=你的database
host=localhost
port =3306 requests_to_mysql.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import ConfigParser
import json
import random
import sys
import time
import pymysql
import requests
import log_config
import datetime logger = log_config.getlogger('reference_mysql', 'reference_mysql.log')
conf = ConfigParser.ConfigParser()
conf.read("mysql.conf")
user = conf.get("mysql", "user")
password = conf.get("mysql", "password")
database = conf.get("mysql", "database")
host = conf.get("mysql", "host")
port = conf.get("mysql", "port")
siteURL = '你要爬取得请求'
fileurl = '可能爬取路径需要拼接的域名' headers = {'Host': '爬取网站的域名',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3103.400 QQBrowser/9.6.11372.400'}
#你爬取的网站可能有很多层条件去过滤,所以你都需要列举处理,一般也包括时间段
cate_dict = {'key':'value'} moudue_dict = {'key': 'value'} industry_dict = {'key':'value'} date_list = ['2018-10-10'] date = time.strftime('%Y-%m-%d', time.localtime(time.time()))
logger.info("start get %s data" % date)
# 启动参数决定是否爬取今天的还是所有的历史数据sys.argv为list,启动不带参数sys.argv[0]默认为当前文件所在位置
if len(sys.argv) != 1:
if sys.argv[1] == 'all':
date = ''
else:
logger.info('input error,please input all')
exit() # 获取总页数
def get_page(dates, category, mod, industry):
data = {'seDate': dates,
'pageNum': 1,
'pageSize': 30,
'category': cate_dict[category],
'column': 'szse',
'plate': mod,
'tabName': 'fulltext',
'trade': industry}
req = requests.post(siteURL, headers=headers, data=data)
content = req.text
content = json.loads(content)
# filelist = content['announcements']
filesum = content['totalAnnouncement']
# print filesum
if filesum != 0:
if filesum % 30 == 0:
pages = filesum / 30
else:
pages = filesum / 30 + 1
return pages
else:
return 0 # 获取一页数据
def get_page_data(dates, category, page, module_type, industry):
# 当前时间必须通过下面方式获取,否者mysql datetime类型不能接受该参数
now_date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
data = {'seDate': dates,
'pageNum': page,
'pageSize': 30,
'category': cate_dict[category],
'column': 'szse',
'plate': module_type,
'tabName': 'fulltext',
'trade': industry}
logger.info("getting page %s" % str(page))
retries = 0
content = ""
while retries < 3:
try:
req = requests.post(siteURL, headers=headers, data=data)
content = req.text
break
except Exception as e:
logger.error("get data failed", e)
retries += 1
logger.info('req error retry %s ' % retries)
# logger.info('req error retry %s '%retries)
t = random.uniform(1, 2)
time.sleep(t)
try:
content = json.loads(content)
filelist = content['announcements']
logger.info("filelist=%s" % len(filelist))
page_datas = []
for fileone in filelist:
# 文件处理状态,mysql中的
pro_status = 0
# java中解析url重试次数,这里不用管,默认设为0
retry_count = 0
sec_code = fileone['secCode']
sec_name = fileone['secName']
announcement_title = fileone['announcementTitle']
announcement_time = fileone['announcementTime']
public_time = date_long_to_str(announcement_time)
adjunct_url = fileurl + fileone['adjunctUrl']
page_data = [category, cate_dict[category], industry_dict[industry], module_type, public_time, public_time,
sec_code, sec_name, announcement_title, adjunct_url, pro_status, retry_count,
now_date, now_date]
page_datas.append(page_data)
if len(page_datas) > 0:
set_data_mysql(page_datas) except Exception as e:
logger.error(
'get this page detail error... [cat:' + category + ' industry:' + industry + ''
' module_type:' + module_type + ' date:' + dates + ']', e) # 批量插入mysql
def set_data_mysql(page_datas):
# 创建连接
conn = pymysql.connect(host=host, port=int(port), user=user, passwd=password, db=database)
# 创建游标
cursor = conn.cursor()
sql = "INSERT INTO test(这里有14个字段) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
effect_row = cursor.executemany(sql, page_datas)
# 提交sql,不提交不会进入mysql
conn.commit()
logger.info("already into dabatabase %s" % effect_row)
# # 下面两行是单行插入
# # listOne = ('年度报告', 'category_ndbg_szsh;', dt)
# # effect_row = cursor.execute(sql, listOne)
# conn.commit() #需要提交来进入数据库
# print effect_row # long转str类型时间1539187200000 1539001526000->2018-10-08 20:25:26
def date_long_to_str(long_date):
if long_date == "" or long_date == 0:
return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
fommat_time = time.localtime(long(long_date)/1000)
time_str = time.strftime("%Y-%m-%d %H:%M:%S", fommat_time)
return time_str # 全局循环爬取
def collect_cate():
if date == '':
for seDate in date_list:
for mod in moudue_dict:
for category in cate_dict:
for industry in industry_dict:
#logger.info("category=%s, mod=%s, industry=%s" % (category, mod, industry))
pages = get_page(seDate, category, moudue_dict[mod], industry)
#logger.info("pages = %s" % pages)
for page in range(1, pages + 1):
get_page_data(seDate, category, page, moudue_dict[mod], industry)
else:
for mod in moudue_dict:
for category in cate_dict:
for industry in industry_dict:
#logger.info("category = %s, mod=%s, industry=%s" % (category, mod, industry))
pages = get_page(date, category, moudue_dict[mod], industry)
#logger.info("pages = %s" % pages)
if 0 != pages:
for page in range(1, pages + 1):
get_page_data(date, category, page, moudue_dict[mod], industry) if __name__ == "__main__":
collect_cate()

python 爬虫之requests+日志+配置文件读取+mysql入库的更多相关文章

  1. Python爬虫练习(requests模块)

    Python爬虫练习(requests模块) 关注公众号"轻松学编程"了解更多. 一.使用正则表达式解析页面和提取数据 1.爬取动态数据(js格式) 爬取http://fund.e ...

  2. 孤荷凌寒自学python第六十七天初步了解Python爬虫初识requests模块

    孤荷凌寒自学python第六十七天初步了解Python爬虫初识requests模块 (完整学习过程屏幕记录视频地址在文末) 从今天起开始正式学习Python的爬虫. 今天已经初步了解了两个主要的模块: ...

  3. python爬虫之requests库

    在python爬虫中,要想获取url的原网页,就要用到众所周知的强大好用的requests库,在2018年python文档年度总结中,requests库使用率排行第一,接下来就开始简单的使用reque ...

  4. 日志配置文件读取spring boot配置文件中的属性

    如果是读取 application.properties 这种spring boot的默认配置文件时 其中 scope固定为context  指明从上下文中获取, name 根据自己的意思给, sou ...

  5. Python爬虫之requests

    爬虫之requests 库的基本用法 基本请求: requests库提供了http所有的基本请求方式.例如 r = requests.post("http://httpbin.org/pos ...

  6. Python爬虫之requests库的使用

    requests库 虽然Python的标准库中 urllib模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests宣传是 "HTTP for ...

  7. Python爬虫 【requests】request for humans

    安装 pip install requests 源码 git clone git://github.com/kennethreitz/requests.git 导入 import requests 发 ...

  8. Python 爬虫二 requests模块

    requests模块 Requests模块 get方法请求 整体演示一下: import requests response = requests.get("https://www.baid ...

  9. python爬虫之requests库介绍(二)

    一.requests基于cookie操作 引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们 ...

随机推荐

  1. mysql之 double write 浅析

    http://blog.itpub.net/22664653/viewspace-1140915/ 介绍double write之前我们有必要了解partial page write 问题 :     ...

  2. openTSDB+HBase+ZK遇到的坑汇总

    1.zookeeper返回的hbase地址是hostname,外网如何访问? 如果需要直接访问zk获取hbase地址进而访问,目前需要本机配置host ip  hostname 如果是要长期解决方法, ...

  3. 前端HTML5介绍

    1.为什么学习HTML5? 跨平台要求低 硬件要求低 flash之外的选择(尤其手机端) 2什么是HTML5? HTML是用来描述网页的一种语言 HTML指超文本标记语言 HTML不是变成语言,是一种 ...

  4. 一个分类,两个问题之ArrayList

    前段时间,在做一个商品的分类,分类有3级,类似于以下这种形式的: ---食物 ---蔬菜 ---白菜 ---材料 ---鸡肉 ....... 而我需要做的是将取得的一个商品的字符串类型的分类ID集,然 ...

  5. Windows:cmd的使用

    1.如果在cmd.exe中无法运行软件(如python),因为在系统的环境变量中,path中没有该软件的安装路径: 2.通过pip安装软件:pip install 文件路径\文件全名,将软件安装在指定 ...

  6. 西安电子科技大学第16届程序设计竞赛 B Words Game

    链接:https://www.nowcoder.com/acm/contest/107/B来源:牛客网 Words Game 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 13107 ...

  7. L2-023. 图着色问题(暴力)

    L2-023. 图着色问题 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 图着色问题是一个著名的NP完全问题.给定无向图 G ...

  8. Oracle session出现大量的inactive

    一.官网说明 1.1 processes 11gR2 的文档: Property Description Parameter type Integer Default value 100 Modifi ...

  9. String字符串补0操作常见方法

     String前补0 java的String字符串补0或空格 方法一:自己写的方法 /* *数字不足位数左补0** @param str* @param strLength*/public stati ...

  10. .Net 之Tuple 类

    Tuple是什么 按照Msdn 上说:提供用于创造元组对象的静态方法.从字面意思并不能理解他的作用:   Tuple 是个静态类,提供8个静态泛型方法:T 可以是值类型,也可是引用类型:   使用场景 ...