这篇文章是在研究生期间的一个小Demo,当时是利用机器学习的一些算法来预测赔率,在这个过程中由于需要数据,所以爬虫就用来爬取球探网的数据。下面就是一小部分代码,展示爬取其中一部分数据的样例。
目标网站
这里以爬取球探网上关于2018年俄罗斯世界杯32支参赛国家队的以往6年的比赛数据为例。
- http://zq.win007.com/cn/CupMatch/648.html
网站分析
一、根据网页内容构建爬取思路
首先在球探网世界杯主题页列出了入围分组赛的32支国家队分组和积分情况 点击任意参赛国家队(比如埃及)的名称,可以链接到该国家队专题页,其中包含了此队从2011年至今所有的比赛成绩和相关数据,也就是我们要爬取的内容。 所以整个爬取思路拟定为:从2018赛季世界杯(世界杯),赛程积分–球探网抓取参赛国家队名称及其对应的国家队数据统计链接,并以这些链接作为二级网址,抓取对应国家队近年来的比赛数据统计信息。最后将爬取下来的信息存入到一个csv文件中。
二、网页html分析
首先在开发者工具中找到我们要在一级网址上抓取的信息位置。我们要爬取的就是位于 中第三个标签里的a标签内容及href属性。
但是在页面点击右键查看源代码时,源代码中并没有上述部分的代码。说明这部分table标签里的内容是通过ajax动态加载的,不是写在源代码里。开发者工具也显示网页使用了jquery框架编写javascript脚本。(国家队比赛数据统计所在表格也是ajax动态加载的,这里我就不重复分析了。)
在看看请求网页时服务器返回的文件,其中Bomhelper.js中写有如下信息:
三、配置selenium和chrome
既然确定了使用selenium库+chrome浏览器的方法,那么我们首先要安装selenium库和相应的浏览器驱动(chromedriver.exe)
selenium库安装
这个很简单,和常用的python包安装一样,可以使用:
pip install selenium
下载和安装chromedriver
打开https://sites.google.com/a/chromium.org/chromedriver/downloads,下载与浏览器版本相匹配的chromedriver.exe。例如:我的浏览器是 Chrome/93.0.4577.15。所以就选用这个版本的。 下载的是一个zip文件,解压后,里面有一个chromedriver.exe文件,将该文件移动到电脑chrome浏览器的安装目录下,我的是:C:\Program Files、(x86)\Google\Chrome\Application,并把该路径添加到环境变量的path中。
验证chromedriver是否可用
打开python,输入一下内容:
from selenium import webdriver
driver = webdriver.Chrome()
点击运行后,此时如果一个chrome浏览器窗口被成功打开,并且程序没有报错,则说明配置成功了。
爬虫代码
from selenium import webdriver
import time
import traceback
def getDriver(url):
try:
driver = webdriver.Chrome()
driver.get(url)
time.sleep(1)
return driver
except:
return ''
def getURLlist(url, teamURLlist):
driver = getDriver(url)
try:
a_list = driver.find_elements_by_xpath('//table[@id="ScoreGroupTab"]/tbody/tr/td[2]/a')
if a_list:
for i in a_list:
teamURLlist.append(i.get_attribute('href'))
driver.close()
return teamURLlist
else:
return []
except:
traceback.print_exc()
return []
def getMatchInfo(teamURLlist, fpath):
with open (fpath, 'w') as f:
f.write('比赛,时间,主队,比分,客队,犯规,黄牌,红牌,控球率,射门(射正),传球(成功),传球成功率,过人次数,评分\n')
if teamURLlist:
for url in teamURLlist:
driver = getDriver(url)
js = 'document.querySelectorAll("tr").forEach(function(tr){tr.style.display="block";})'
driver.execute_script(js)
infolist = driver.find_elements_by_xpath('//div[@id="Tech_schedule"]/table/tbody/tr')
for tr in infolist[1:]:
td_list = tr.find_elements_by_tag_name('td')
matchinfo = []
for td in td_list:
info = td.text
if info:
matchinfo.append(td.text)
matchinfo.append(',')
matchinfo.append('\n')
f.writelines(matchinfo)
driver.close()
def main():
start_url = 'http://zq.win007.com/cn/CupMatch/75.html'
output = r'D:/03-CS/web scraping cases/qiutan/worldcup2018.csv'
startlist = []
resultlist = getURLlist(start_url, startlist)
getMatchInfo(resultlist, output)
print('\nfinished\n')
main()
小结
这个过程主要用到如下知识点:
使用selenium+chrome的组合来模拟chome浏览器发送请求,处理ajax异步加载数据以及服务器对发送请求浏览器的限制。 解决了如何爬取属性为display: none的标签内容:编写一段修改属性的javascript代码交个webdriver去执行。
还有一点就是这个网站估计被爬的次数特别多,应该做了防爬取的措施,网页加载很慢,这个有待优化。
|