0xSui 发表于 2020-4-3 15:35

写个问卷星答题的爬虫脚本,试了下基本通用,供参考学习

本帖最后由 0xSui 于 2021-8-16 08:31 编辑

代码规则有部分变动,修改下div和class判断,现在可以识别题目的。
顺便查看了下,官网的题目(/m)是移动端页面,(/jq)是pc页面。
今天单位让答题,打开链接准备答题,提示:电脑上面答不了,还只能微信扫码答题,看了下网页的内容,是问卷星的答题卷;
题目和选项都在页面里面写好了,所以就简单写了个爬虫代码,用了beautifulsoup、requests,另外存储抓取内容用了mysql数据库;
题目的选项个数不一定统一,所以数据大家使用的时候,可以直接把抓取到的题目都放到一个字段里面存着,后面要用的时候,直接读出来,遍历就行;
再就是,这网站暂时没有防爬机制,所以直接while循环遍历那种随机题目的地址,就能刷出来整个题库的题目(稍微改改代码就能爬整个网站的题库了);
代码比较简单,简单分享,仅供学习~

# -*- coding: utf-8 -*-
import time
import requests
import random
from bs4 import BeautifulSoup
import pymysql
from faker import Faker
fake = Faker(locale='zh_CN')

# 在这里配置mysql数据库的配置
mysql_host = '127.0.0.1'
# 数据库名称
mysql_db = 'wjx'
# 账号
mysql_user = 'root'
# 密码
mysql_password = '123'
# 端口
mysql_port = 3306
pages = []


def ua(refer_str):
    headers = {'User-Agent': fake.user_agent()}
    if len(refer_str) > 0:
      headers.update(Referer=refer_str)
    return headers

def db_insert(title, a, b, c):
    sql_s = '''insert ignore into questions (title, answer_a, answer_b, answer_c) values(%s, %s, %s, %s)'''
    db = pymysql.connect(host=mysql_host, port=mysql_port, user=mysql_user, password=mysql_password, db=mysql_db, charset='utf8')
    cursor = db.cursor()
    cursor.execute(sql_s, (title, a, b, c))
    db.commit()
    db.close()


def html_get(url, header):
    with requests.Session() as s:
      s.keep_alive = False
      html = ""
      while html == "":
            try:
                res_get = s.get(url, headers=header)
                # stream=True
                print(res_get.status_code)
                html = res_get.content
                return res_get.content
            except Exception as e:
                print(e)
                print('下载出错: %s' % url)
                continue


def get_wjx(wj_url):
    html_str = html_get(wj_url, ua(refer_str='http://ks.wjx.top'))
    # print(str(html_str, 'utf-8'))
    bs_str_all = BeautifulSoup(str(html_str, 'utf-8'), 'html.parser').findAll("div", attrs={"class": "field ui-field-contain"})
    # print(bs_str_all)
    for item in bs_str_all:
      t = ''
      ss = []
      title = item.findAll('div', attrs={'class': 'field-label'})
      sections = item.findAll('div', attrs={'class': 'label'})
      # if title.get_text() == '基本信息:*':
      #   print("跳过该记录")
      # else:
      for t in title:
            t = t.get_text()
      for section in sections:
            ss.append(section.get_text())
      if len(ss) < 1:
            print('跳过空白题目')
      else:
            print(t)
            print(ss)
            # 开始插入数据库
            # 不确定选项数,我抓题用的是三个选项的,根据题目情况特殊处理
            if len(ss) < 3:
                ss.append('')
            if len(ss) < 4:
                ss.append('')
            s_a = ss
            s_b = ss
            s_c = ss
            s_d = ss
            db_insert(title=t, a=s_a, b=s_b, c=s_c, d=s_d)

def job():
    print('开始抓取')
    while True:
      url1 = 'https://ks.wjx.top/jq/63596149.aspx'
      get_wjx(wj_url=url1)
      time.sleep(3)


if __name__ == '__main__':
    # 调试执行
    job()

0xSui 发表于 2020-9-23 15:41

Koardor 发表于 2020-9-23 08:05
现在防爬了 返回200

不是的,200是html_get方法打印的返回状态值,不出结果是因为div标签修改了class值,所以没有匹配到题目内容,调试下抓取代码就又可以正常抓取了

theasonq 发表于 2020-11-28 16:56

Traceback (most recent call last):
File "D:/works/python/wjx.py", line 132, in <module>
    job()
File "D:/works/python/wjx.py", line 126, in job
    get_wjx(wj_url=url1)
File "D:/works/python/wjx.py", line 120, in get_wjx
    db_insert(title=t, a=s_a, b=s_b, c=s_c, d=s_d)
TypeError: db_insert() got an unexpected keyword argument 'd'
>>>
这个怎么破,就爬取了一个题目后出错了

BlovedCQ 发表于 2020-4-3 21:43

至今大佬

cdtily 发表于 2020-4-4 15:55

谢谢分享,最近在学python,参考研究一下

梦回q 发表于 2020-4-9 09:36

大佬这个是获取一个答题的题目和答案的吗

神慯 发表于 2020-4-25 13:41

感谢!!!代码写的很漂亮!!学到很多!第一次对爬虫有直观的认识!!

郭小生 发表于 2020-5-7 12:08

直接放入油猴就可以了?
大佬

0xSui 发表于 2020-5-9 22:13

郭小生 发表于 2020-5-7 12:08
直接放入油猴就可以了?
大佬

这是python代码,需要安装python,用pip安装依赖,再用python xxx.py来执行代码

0xSui 发表于 2020-5-9 22:14

神慯 发表于 2020-4-25 13:41
感谢!!!代码写的很漂亮!!学到很多!第一次对爬虫有直观的认识!!

有帮助到就好,我也是初学者

lcylcylcy 发表于 2020-5-11 13:41

浏览学习

houniyijiu 发表于 2020-5-17 18:20

太厉害了
页: [1] 2 3 4
查看完整版本: 写个问卷星答题的爬虫脚本,试了下基本通用,供参考学习