python 爬虫之requests+日志+配置文件读取+mysql入库


#
!/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()

 

转载于:https://www.cnblogs.com/keepMoveForevery/p/9777155.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python爬虫是一种自动化程序,可以通过requests和beautifulsoup等库来获取网页信息,并使用pandas等工具对数据进行处理和分析。使用Python爬虫可以快速获取大量数据,帮助我们进行数据挖掘和分析。 ### 回答2: Python是一种强大的编程语言,在网络爬虫方面也有着广泛应用。requests、BeautifulSoup和Pandas就是其中的三个非常重要的工具,它们各自的功能和作用如下: Requests(请求):是一个Python中的HTTP库,可以轻松的发送HTTP请求,并且可以很容易地获取返回的内容。如果你想获取一个网页的HTML代码,你可以使用Requests库。你需要向requests.get()方法传递一个URL,然后它会返回一个response对象,可以通过response.text来获取文本内容。 BeautifulSoup(漂亮的汤):是Python一个解析HTML和XML文件的库,它可以从这些文件中提取有用的信息。所以,你可以使用BeautifulSoup来提取网页中的信息。通过BeautifulSoup库可以把一个已经读入python中的response响应文件对象进行分析,也就是通过一些HTML标签(soup.a/b/p/div),来获取我们想要的内容。 Pandas(熊猫):是一个强大的数据分析工具,其核心是用于数据处理和矩阵计算的高效核心数据结构Dataframe。使用Pandas库可以很容易地从文本文件中导入数据,然后进行数据清洗、规整、合并、并统计数据等等各类操作。下面我们详细介绍一下这些库的用法。 在进行数据抓取之前,我们首先需要对需要抓取的数据进行需求分析,即确定需要抓取的网站、需要抓取的数据点和格式,以及需要进行的数据处理方式和数据储存方式等。当我们完成了需求分析之后,就可以开始进行数据抓取了。 首先我们需要安装requests、BeautifulSoup和Pandas库: ```python pip install requests pip install BeautifulSoup4 pip install pandas ``` 然后我们可以使用以下代码,来展示如何进行数据抓取: ```python import requests from bs4 import BeautifulSoup import pandas as pd # 请求URL并将结果解析为HTML url = 'https://movie.douban.com/top250' resp = requests.get(url) html_data = resp.text soup = BeautifulSoup(html_data, 'html.parser') # 获取电影名称和评分信息 movie_list = soup.find_all('div', class_='hd') title_list = [movie.a.span.text for movie in movie_list] rating_list = [movie.find_next_siblings('div')[0].span.text for movie in movie_list] # 构建DataFrame并将结果保存为CSV文件 movie_df = pd.DataFrame({'title': title_list, 'rating': rating_list}) movie_df.to_csv('top250_movies.csv', index=False) ``` 通过以上代码,我们可以获取到豆瓣电影Top250的电影名称和评分信息,并将结果储存为CSV文件。 总之,requests、BeautifulSoup和Pandas是Python网络爬虫中非常常用的工具。使用这些库,我们可以轻松地进行数据抓取、数据提取、数据处理和数据储存等操作。同时,我们在进行爬虫之前,一定要注意合法性和尊重原网站的规则。 ### 回答3: Python是目前最流行的编程语言之一,其生态系统非常丰富,可以应用于各种领域。其中,爬虫Python应用广泛的领域之一。在Python爬虫中,requests、beautifulsoup和pandas都是非常常用的库。 requests是一个用于HTTP请求的Python库,可以方便地发送网络请求,并且可以处理响应数据。在Python爬虫中,我们通常使用requests库下载网页内容。例如,我们可以使用requests库的get方法获取网页内容,如下所示: ``` import requests response = requests.get('http://www.baidu.com') print(response.text) ``` beautifulsoup是一个解析HTML和XML文档的Python库,可以方便地从网页中提取所需的数据。使用beautifulsoup库,我们可以方便地解析从网页中提取的数据,并进行数据清洗和处理。例如,我们可以使用beautifulsoup库的find_all方法查找特定标签中的文本内容,如下所示: ``` from bs4 import BeautifulSoup import requests response = requests.get('http://www.baidu.com') soup = BeautifulSoup(response.text, 'html.parser') print(soup.find_all('a')) ``` pandas是一个用于数据分析和处理的Python库,提供了许多有用的功能,例如读取、处理和分析数据。在Python爬虫中,我们通常使用pandas库来处理从网页中提取的数据,并将其保存到CSV文件或数据库中以供进一步分析。例如,我们可以使用pandas库的read_html方法读取HTML表格数据,并将其保存为CSV文件,如下所示: ``` import pandas as pd url = 'http://www.example.com' tables = pd.read_html(url) df = tables[0] df.to_csv('example.csv', index=False) ``` 综上所述,Python爬虫中的requests、beautifulsoup和pandas库是非常重要的工具,能够帮助我们方便地下载网页内容、提取数据和进行数据处理和分析。如果您有兴趣学习Python爬虫,那么这些库将是您必须掌握的重要工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值