博客更新:
前言
莫名其妙博客不给通过,搞了好久避开各种词。谜一样的操作···
前面已经写了两篇,都是用requests
爬取页面,之前腾讯提供的接口用的json
解析内容,丁香园则是直接用BeautifulSoup
。
requests+json爬取腾讯新闻feiyan实时数据并实现持续更新
requests+bs4爬取丁香园feiyan实时数据
但是之前用腾讯的接口,一方面腾讯老是换接口,另一方面提供的接口经常不更新数据。而丁香园的数据吧,老是不大准确(比如有两天阿根廷的数据都错了,但可能刚好只是那几天不准确吧)。
由于出现以上种种问题,我决定还是折腾腾讯新闻实时界面,直接爬取那上面的数据。这篇博客就说一下如何使用selenium
直接爬取腾讯新闻实时页面的数据。
selenium准备
首先要装好selenium
,chrome
以及chromedriver
。selenium
的安装就是正常的python库的安装,这里使用国内镜像加速了安装过程:
pip install selenium -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
国内镜像安装参考博文:
Windows下只需要安装好chrome浏览器,然后在chromedriver.storage.googleapis.index.html下载对应版本的chromedriver
,chrome版本可以用以下命令查看:
google-chrome --version
下载后将压缩包解压,放进C:\Users\zhang\AppData\Local\Google\Chrome\Application
(自行找下自己的google浏览器路径),再将这个路径放到系统环境变量的Path里面即可。
如果是服务器,同样需要安装chrome
跟chromedriver
。Linux服务器可以下载好后传上服务器,用yum
进行安装,也可以直接用命令下载。最后解压chromedriver
后记得输入命令(非Windows才需要哦):
chmod +x chromedriver
服务器安装chrome
跟chromedriver
可以自行搜索。
探索腾讯新闻页面
前往腾讯新闻页面,选海外数据。为什么腾讯新闻的页面不能跟丁香园那样爬取呢?我们来看下requests
抓取下来的内容是什么:
import requests
url = "https://news.qq.com/zt2020/page/feiyan.htm#/global"
r = requests.get(url)
data = r.text
我们可以发现,requests
爬下来的页面内容压根就没有出现我们要的数据,而是连接到一个app.js的页面。这就是为什么没法用丁香园的方法来爬取了。
selenium探索
我们使用selenium.webdriver
试试看:
from selenium import webdriver
url = "https://news.qq.com/zt2020/page/feiyan.htm#/global"
executable_path = 'C:/Users/zhang/AppData/Local/Google/Chrome/Application/chromedriver'
dr = webdriver.Chrome(executable_path)
dr.get(url)
这里的executable_path
就是之前chromedriver
的路径。这时候会自动打开一个浏览器页面,就是腾讯新闻的页面。如果我们不想要弹出这个浏览器页面,可以通过
webdriver.ChromeOptions()
进行配置:
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--headless')
dr = webdriver.Chrome(chrome_options = chrome_options, executable_path = executable_path)
这样子就不会弹出浏览器页面了。
页面内容探索
我们接着看腾讯新闻页面,查看网页源码,选到我们需要的地方:
一路下来,这个table
里的每一个tbody
就是一条数据。我们根据源码一路定位到table的地方:
from selenium import webdriver
url = "https://news.qq.com/zt2020/page/feiyan.htm#/global"
executable_path = 'C:\\Users\\zhang\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--headless')
dr = webdriver.Chrome(chrome_options = chrome_options, executable_path = executable_path)
dr.get(url)
main_view = dr.find_element_by_id('app')
table = main_view.find_element_by_xpath("//div/div[@class='globalWraper']/div[3]/div[@class='foreignListWraper']/div[@class='listWraper filterGray']/table")
tableList = table.text
我们看到爬下来的数据,地区会自成一行,然后相关数据为一行。我们再进行一下处理:
tableList = tableList.split('\n')
countryList = tableList[0::2]
dataList = tableList[1::2]
这样子我们就把国家跟数据分别取了出来:
接着,我们就可以直接用一个list来放我们要的数据啦:
resultList = []
for i in range(1, len(countryList)):
place_dict = {}
place_dict['place'] = countryList[i]
temp = dataList[i].split(' ')
place_dict['confirmed_num'] = temp[1]
place_dict['cure_num'] = temp[2]
place_dict['die_num'] = temp[3]
resultList.append([place_dict['place'], place_dict['confirmed_num'],
place_dict['cure_num'], place_dict['die_num']])
也可以直接转成dataframe:
import pandas as pd
resultDf = pd.DataFrame(resultList, columns = ['place', 'confirmed_num', 'die_num', 'cure_num'])
结语
到这里,腾讯新闻跟丁香园的实时页面爬取就都实现啦~关于腾讯的数据爬取要注意看源码,腾讯老是改来改去的。
最后的最后,审核真的神烦···唉有很多想吐槽的,有这劲不能放到各种该查的(比如违法偷拍平台,真的是···)地方吗···