Born in Lanark and brought up in nearby Carluke, Crawford played as a child with local club Milton Rovers before joining the youth setup at Heart of Midlothian, but he was released in 2006 due to concerns over his slight build. Picked up by Hamilton Academical, he progressed to the first team and made his league debut aged 18 on 13 January 2010 against Dundee United, and spent a loan spell at Bo'ness United during the first half of the 2010–11 season. In May 2011, he signed a new two-year contract with Hamilton despite the club suffering relegation. In June 2012, Crawford announced that he was willing to prove his worth at the club following a spell of injury. On 28 August 2012, Crawford scored the only goal of the game as Hamilton beat Partick Thistle 1–0 in extra time in the 2012–13 Scottish League Cup, and he later spoke of his desire to help "kick-start" the season. Crawford signed a new two-year contract in July 2013. At the start of the 2013–14 season, Crawford publicly stated that the new synthetic pitch at New Douglas Park would give Hamilton an advantage over their opponents. In April 2014 he was selected to the 2013–14 ChampionshipPFA Scotland Team of the Year, alongside teammates Ziggy Gordon and Anthony Andreu. A month later, Crawford was part of the Hamilton team which won promotion back to the Premiership by defeating Hibernian in the play-off final. In October 2014 he signed a new contract with the club, to last until the summer of 2018. In August 2015, he scored a late winning goal against Hearts in the first match he had played against his former youth club. In September 2016 it was suggested by Hamilton manager Martin Canning that Crawford should play for the Scottish national team. In November 2016 club captain Michael Devlin said that the team hoped that Crawford would not leave the club in the January 2017 transfer window. In December 2016, Canning said they wished to keep Crawford until the end of the 2016–17 season. Crawford was one of seven first-team players who left Hamilton at the end of the 2017–18 season; he stated that his preference was to play in England.
On 10 July 2018, Crawford signed for League One side Doncaster Rovers on a two-year contract.
Bolton Wanderers
On 2 September 2019, Crawford signed for fellow League One side Bolton Wanderers on a contract until the end of the season, after terminating his contract with Doncaster Rovers. He made his debut on 14 September, starting against Rotherham United in a 6-1 defeat. He scored his first goal for the club in the EFL Trophy game at Rochdale on 1 October, a game Bolton eventually lost on penalties. On 26 June it was announced Crawford would be one of 14 senior players released at the end of his contract on 30 June, but he returned to the club a few days later after signing a new two-year contract, turning down League One teams in order to return.