本文将介绍如何使用Python编程语言爬取问卷星,以及该过程中需要注意的一些问题。
一、网页分析
在爬取任何一个网页之前,首先要对该网页进行分析。我们可以使用Chrome浏览器中的开发者工具来分析问卷星的网页。
我们可以通过分析问卷星的网页发现,问卷星的每个问卷都有一个唯一的ID号,可以通过这个ID号来访问这个问卷的结果。对于一个新发布的问卷,ID号会随机生成,但是如果我们知道了这个问卷的名称,我们就可以通过访问一个指定的网址来获取该问卷的ID号。
二、数据爬取
在这里,我们会使用到Python中的requests库和BeautifulSoup库,它们分别用于获取网页源代码和解析网页源代码。
下面是代码示例:
import requests from bs4 import BeautifulSoup url = 'https://www.wjx.cn/' res = requests.get(url,headers={'User-Agent':'Mozilla/5.0'}) soup = BeautifulSoup(res.content,'html.parser')
上述代码中,我们首先使用requests库获取网页源代码,同时指定了一个headers参数,用于添加User-Agent,以防止爬虫被网站反爬虫机制所捕获。然后,我们使用BeautifulSoup库对网页源代码进行解析,并赋值给soup对象。
三、数据解析
在获取到问卷的HTML源代码后,我们需要使用BeautifulSoup库来解析这些源代码,并且获取到我们需要的信息。
下面是代码示例:
#定位到问卷信息 questionnaire = soup.select('.wjquesbox') for ques in questionnaire: #获取问卷名称 name = ques.select('.surveyright')[0].select('h3')[0].text #根据问卷名称获取问卷ID id_url = 'https://www.wjx.cn/search/searchkey.aspx' id_params = {'q':name, 'page':1} id_res = requests.get(id_url, headers={'User-Agent':'Mozilla/5.0'}, params=id_params) id_soup = BeautifulSoup(id_res.content,'html.parser') id_html = id_soup.find_all('a', {'class' : 'q_title'}) id = id_html[0]['href'].split('&')[0].split('=')[1] #获取问卷提交数量 num_url = 'https://www.wjx.cn/statistics/GetWDV.aspx' num_params = {'qid':id} num_res = requests.get(num_url, headers={'User-Agent':'Mozilla/5.0'}, params=num_params) num_html = num_res.content.decode('utf-8') num = num_html.split('|')[1]
在上述代码中,我们首先定位到问卷所在的位置,然后使用select方法获取到问卷中的所有信息。接着,我们从中提取出该问卷的名称,并使用该名称来获取问卷的ID。我们先访问一个指定的网址,并且通过params参数来传递关键字q和page,从而得到与该名称匹配的问卷信息。然后,我们对得到的结果使用BeautifulSoup进行解析,并获取到了该问卷的ID。
接着,我们使用获取到的问卷ID来获取该问卷的提交数量。我们同样使用requests库发送一个GET请求,并通过params参数来传递qID号,从而得到该问卷的提交数量。最后,我们通过字符串的处理,获取到了问卷的提交数量。
四、数据存储
在数据获取之后,我们可以将其保存到一个文件当中,也可以将其保存至数据库。
下面是代码示例:
import csv with open('survey.csv', mode='w', encoding='utf-8', newline='') as survey_file: survey_writer = csv.writer(survey_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) #写入表头 survey_writer.writerow(['问卷名称', '问卷提交数量']) #写入问卷信息 for ques in questionnaire: name = ques.select('.surveyright')[0].select('h3')[0].text id_params = {'q':name, 'page':1} id_res = requests.get(id_url, headers={'User-Agent':'Mozilla/5.0'}, params=id_params) id_soup = BeautifulSoup(id_res.content,'html.parser') id_html = id_soup.find_all('a', {'class' : 'q_title'}) id = id_html[0]['href'].split('&')[0].split('=')[1] num_params = {'qid':id} num_res = requests.get(num_url, headers={'User-Agent':'Mozilla/5.0'}, params=num_params) num_html = num_res.content.decode('utf-8') num = num_html.split('|')[1] survey_writer.writerow([name, num])
在上述代码中,我们使用了csv库将问卷的名称和提交数量保存至survey.csv文件当中。
五、其他问题
在爬取过程中,我们需要注意以下几个问题:
1、不要过于频繁地请求同一个网站,否则可能会被该网站的反爬虫机制所捕获。
2、尽量使用xpath或者css选择器来定位所需要的网页元素。
3、在获取网页源代码后,要对其进行一些简单的处理,如将源代码中的HTML实体进行处理、解码等。
六、总结
本文主要介绍了如何使用Python爬取问卷星的方法,并且强调了爬取过程中需要注意的一些问题。希望这篇文章对初学者有所帮助。
最新评论