本站使用了 Pjax 等基于 JavaScript 的开发技术,但您的浏览器已禁用 JavaScript,请开启 JavaScript 以保证网站正常显示!

Python爬虫学习(3)_略有小成

上次写的爬虫工具, 可以通过手工指定url获取到比赛数据; 请看这里

这次将上次的代码加以优化, 将代码定义成函数, 将url中的日期设置为参数, 可以实现自动化采集近期的数据, 或者通过手工指定日期的方式采集某天的数据

备注: 文中替换了某些隐私信息, 照搬无法执行!

方案一: 每次执行后,自动爬取最近n天的数据

import requests
from bs4 import BeautifulSoup as bsoup
import re
import time,datetime
import MySQLdb

# 抓取比赛信息, 传入参数date为彩期
def live_spider(date):
    match_list = []  # 存储抓取的比赛列表

    # 请求头 *后续可以单独设计一个模块存放各种请求头, 这里随机抽取*
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
        AppleWebKit/537.36 (KHTML, like Gecko) \
        Chrome/79.0.3945.29 Safari/537.36 Edg/79.0.309.18'}
    res = requests.get('http://网址隐藏/?e='+str(date),headers = headers)
    res.encoding = 'GB2312'
    # print(res.status_code) # 请求状态检测
    text = res.text
    text_div = bsoup(text,'html.parser')

    table = text_div.find('table',id = 'table_match') # 定位到<table ... id='table_match'>
    tbody = table.find('tbody') # 定位到<tbody>
    tr = tbody.find_all('tr') # 定位到<tr>

    for tr_tag in tr: # 提取tag
        fid = tr_tag['fid'] # tr属性['fid']

        td = tr_tag.find_all('td') # 定位到<td>
        # [0]场次;[1]联赛;[2]轮次;[3]比赛时间;[4]状态;[5][gray]主排名;[5][a]主队;[5][sp]受让球;
        # [6][clt1]主进球;[6][clt3]客进球;[7][a]客队;[7][gray]客排名;[8]半场比分
        match_no = td[0].text
        league = td[1].text
        match_turns = td[2].text
        match_time = str(datetime.datetime.now().year)+'-'+td[3].text
        state = td[4].text
        home_name = td[5].find('a').text
        guest_name = td[7].find('a').text
        sp = td[5].find_all('span',class_=re.compile('sp'))[0].text
        clt1 = td[6].find_all('a',class_='clt1')[0].text
        clt3 = td[6].find_all('a',class_='clt3')[0].text 
        half_scores = td[8].text
        # home_gray = td[5].find_all('span',class_='gray')[0].text
        # guest_gray = td[7].find_all('span',class_='gray')[0].text

        match_list.append([fid,match_no,league,match_turns,match_time,state,home_name,guest_name, \
            sp,clt1,clt3,half_scores])
    return match_list
# print(live_spider('2019-10-10')) # 手动传入日期检测 <class 'list'>

# 返回当前日期最近的n天, n = day
def recent_days(day):
    day_list = [] 
    today = datetime.date.today()
    for recent_day in range(day):
        offset = datetime.timedelta(days = recent_day*-1)
        date_ = (today+offset)
        day_list.append(str(date_))
    return day_list
# print(recent_days(3)) # <class 'list'>

# 爬取最近n天的比赛数据, 写入mysql数据库
for date in recent_days(2):
    match_list = live_spider(date)

    # 连接数据库 ********************注意信息泄露**********************
    db = MySQLdb.connect('IP地址','用户名','密码','数据库名',charset='utf8')
    # 使用cursor()方法获取操作游标 ?什么是游标?
    cursor = db.cursor()
    # 执行sql语句
    sql = 'REPLACE INTO LIVE (MATCH_NO,WEEK_ORDER,LEAGUE,ROUNDS,MATCH_TIME, \
          STATE,HOME_TEAM,VISITING_TEAM,CONCEDE,HOME_GOALS,VISITING_GOALS,SCORE_HALF) \
          VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
    try:
        # 执行sql语句
        cursor.executemany(sql,tuple(match_list))
        # 提交到数据库执行
        db.commit()
    except:
        # 发生错误时回滚
        db.rollback()

    db.close()

方案二: 手工指定某天或者最近n天

import MySQLdb
import live_spider as ls # 将方案一保存为live_spider.py后引入

date_class = input('1.采集指定日期;2.采集最近n天:')

if date_class == '1':
    dates = []
    dates.append(input('请输入采集日期(格式:2018-11-02):'))
elif date_class == '2':
    days = input('你想采集最近几天的数据:')
    dates = ls.recent_days(int(days))

for date in dates:
    match_list = ls.live_spider(date)

    # 连接数据库  ********************注意信息泄露**********************
    db = MySQLdb.connect('IP地址','用户名','密码','数据库名',charset='utf8')
    # 使用cursor()方法获取操作游标 ?什么是游标?
    cursor = db.cursor()
    # 执行sql语句
    sql = 'REPLACE INTO LIVE (MATCH_NO,WEEK_ORDER,LEAGUE,ROUNDS,MATCH_TIME, \
          STATE,HOME_TEAM,VISITING_TEAM,CONCEDE,HOME_GOALS,VISITING_GOALS,SCORE_HALF) \
          VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
    try:
        # 执行sql语句
        cursor.executemany(sql,tuple(match_list))
        # 提交到数据库执行
        db.commit()
    except:
        # 发生错误时回滚
        db.rollback()

    db.close()

帮助小微企业构建在线化、智能化的经营管理体系,让经营管理更轻松!

推广

 继续浏览关于 爬虫足彩数据 的文章

 本文最后更新于:2020/01/11 15:07:21,可能因经年累月而与现状有所差异,有任何疑问可以随时与258771198@qq.com沟通,邮箱永久有效

 引用转载请注明:魔码科技 > Python > Python爬虫学习(3)_略有小成

发现共鸣

如是说:嘛,那又怎么样呢?