本文将介绍如何使用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爬取问卷星的方法,并且强调了爬取过程中需要注意的一些问题。希望这篇文章对初学者有所帮助。