写个问卷星答题的爬虫脚本,试了下基本通用,供参考学习
本帖最后由 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()
Koardor 发表于 2020-9-23 08:05
现在防爬了 返回200
不是的,200是html_get方法打印的返回状态值,不出结果是因为div标签修改了class值,所以没有匹配到题目内容,调试下抓取代码就又可以正常抓取了 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'
>>>
这个怎么破,就爬取了一个题目后出错了 至今大佬 谢谢分享,最近在学python,参考研究一下 大佬这个是获取一个答题的题目和答案的吗 感谢!!!代码写的很漂亮!!学到很多!第一次对爬虫有直观的认识!! 直接放入油猴就可以了?
大佬 郭小生 发表于 2020-5-7 12:08
直接放入油猴就可以了?
大佬
这是python代码,需要安装python,用pip安装依赖,再用python xxx.py来执行代码 神慯 发表于 2020-4-25 13:41
感谢!!!代码写的很漂亮!!学到很多!第一次对爬虫有直观的认识!!
有帮助到就好,我也是初学者 浏览学习 太厉害了