吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4526|回复: 7
收起左侧

[Python 转载] 自己编写的爬取时事一点通每日时政的考点、练习题和答案

[复制链接]
guosong1213 发表于 2019-11-12 08:44
考试需要用到时政知识,发现时事一点通的时政内容比较好,还有练习题和答案。就打算爬取它的每日时政的内容、练习题和答案。
开始打算直接用requests解析,发现练习题需要登录账号才能获取,还有数据响应超时,加上headers也不起作用。
然后用谷歌的无头浏览器,无法定位答案页的提交答案按钮。
研究了好几天,最后决定用360浏览器进行自动操作。终于成功了。
安装好必要的包,代码里面带星号的网址改成网站的网址,就可以成功执行的。
大家可以实际操作一下,可以看到效果。


[Python] 纯文本查看 复制代码
from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.action_chains import ActionChains

from pyquery import PyQuery as pq

from time import sleep

import requests

import re

import json

#打开360安全浏览器进行自动化操作

__browser_url = r'C:\Users\Administrator\AppData\Roaming\360se6\Application\360se.exe'  ##360浏览器的安装地址

chrome_options = Options()

chrome_options.binary_location = __browser_url

driver = webdriver.Chrome(chrome_options=chrome_options)

#登录账号,获取列表页链接

def get_liebiao():

    driver.get('http://www.*****.com/login')#登录页面

    driver.find_element_by_css_selector('#tab-tabPwd').click()

    sleep(10)

    driver.find_element_by_css_selector('#pane-tabPwd > form > div:nth-child(1) > div > div > input').send_keys("**********")#账号名

    driver.find_element_by_name('password').send_keys("*********")#密码

    driver.find_element_by_css_selector('#pane-tabPwd > form > div:nth-child(3) > div > button > span').click()

    sleep(5)

    driver.find_element_by_css_selector('#app > header > div.container > ul > li:nth-child(3) > a').click()#自动跳转到首页,点击首页的资讯

    sleep(5)

    for i in range(1):#连续点击更多,获取你想要的日期内容,我设置的是1,因为我是一个月一个月保存的。刚开始我要爬一年的,设置的事是13.

        driver.find_element_by_css_selector('#app > div.container > div > div.el-col.el-col-24.el-col-xs-24.el-col-sm-24.el-col-md-16 > div > button').click()

        sleep(5)

    html = driver.page_source

    pattern = re.compile('class="article-item".*?href="(.*?)" target="_blank" title="(.*?)">', re.S)

    kaodians = re.findall(pattern, html)

    for i in range(len(kaodians)-1,-1,-1):#获取的链接是从最近的日期开始的,我想让日期从远到近,就进行了倒序处理。

        yield {

            'biaoti': kaodians[i][1],

            'kaodian_url': 'http://www.*****.com'+kaodians[i][0]#整理内日时事的链接

        }



def write_to_file(wenjian, content):

    with open(wenjian+'.txt', 'a', encoding='utf-8') as f:

        f.write(json.dumps(content, ensure_ascii=False) + '\n')#数据写入TXT文件,考点、题库和答案放在不同的文件中

        f.close()



def get_timu(html):#爬取练习题,用的正则

    pattern_2 = re.compile(

        '<h3 data-v-238eeb99="">(.*?)<em data-v-238eeb99="">(.*?)</em>(.*?)</h3>.*?'

        + '<span data-v-238eeb99="">(.*?)</span> <div data-v-238eeb99="">(.*?)</div>.*?'

        + '<span data-v-238eeb99="">(.*?)</span> <div data-v-238eeb99="">(.*?)</div>.*?'

        + '<span data-v-238eeb99="">(.*?)</span> <div data-v-238eeb99="">(.*?)</div>.*?'

        + '<span data-v-238eeb99="">(.*?)</span> <div data-v-238eeb99="">(.*?)</div>', re.S)

    items = re.findall(pattern_2, html)

    for item in items:

        yield {

            'timu': item[0] + item[1] + item[2],#题号+类型+题干

            'x1': item[3] + '、' + item[4],#四个选项

            'x2': item[5] + '、' + item[6],

            'x3': item[7] + '、' + item[8],

            'x4': item[9] + '、' + item[10]

        }



def get_daan(html):#爬取答案

    pattern_2 = re.compile(

        '<h3 data-v-1c52a667="">(.*?)<em.*?option right"><span data-v-1c52a667="">(.*?)</span> <div data-v-1c52a667="">(.*?)</div>',

        re.S)

    items_daan = re.findall(pattern_2, html)

    for item_daan in items_daan:

        str_daan = item_daan[0] + item_daan[1] + item_daan[2]

        write_to_file('daan', '' + str_daan + '')



def get_kaodian(kaodian):#爬取每天的时事内容

    js='window.open("'+kaodian["kaodian_url"]+'");'

    driver.execute_script(js)

    driver.switch_to_window(driver.window_handles[1])

    sleep(5)

    html = driver.page_source

    items = driver.find_elements_by_tag_name('p')

    write_to_file('kaodian', '')

    write_to_file('kaodian','' + kaodian["biaoti"] + '')

    write_to_file('kaodian', '')

    for item in items:

        write_to_file('kaodian','[[' + item.text + ']]')

    driver.find_element_by_css_selector('#app > div.container > div > div.el-col.el-col-24.el-col-xs-24.el-col-sm-24.el-col-md-16 > div > button > span').click()

    sleep(5)

    if 'p_type=02' in driver.current_url:#爬取时出了一点小问题,所以加了这个判断

        html = driver.page_source

        write_to_file('tiku', '')

        write_to_file('tiku', '' + '测试:'+kaodian["biaoti"] + '')

        write_to_file('tiku', '')

        for item in get_timu(html):

            write_to_file('tiku',''+item['timu']+'')

            write_to_file('tiku',''+item['x1']+'')

            write_to_file('tiku',''+item['x2']+'')

            write_to_file('tiku',''+item['x3']+'')

            write_to_file('tiku',''+item['x4']+'')

        move = driver.find_elements_by_xpath("//button")[1]

        ActionChains(driver).move_to_element(move).perform()

        sleep(5)

        driver.find_elements_by_xpath("//button")[1].click()

        sleep(5)

        driver.find_element_by_css_selector(

            'body > div.el-message-box__wrapper > div > div.el-message-box__btns > button.el-button.el-button--default.el-button--small.el-button--primary').click()

        sleep(5)

        write_to_file('daan', '')

        write_to_file('daan', '' + '测试答案:'+kaodian["biaoti"] + '')

        write_to_file('daan', '')

        get_daan(driver.page_source)

    driver.close()

    driver.switch_to_window(driver.window_handles[0])



def main():

    for kaodian in get_liebiao():

        get_kaodian(kaodian)

    driver.quit()



if __name__ == '__main__':

    main()

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| guosong1213 发表于 2020-1-6 07:49
先安装Python3.6,在安装上面所有的包,就可以运行我的代码了。 安装包的具体方法百度一下就很容易学会。需要的包有selenium,pyquery,requests,json。比较麻烦的是配置浏览器驱动,方法网上也有很多。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
wjy961121 + 1 + 1 谢谢@Thanks!

查看全部评分

PJ52JP 发表于 2019-11-18 14:07
wjy961121 发表于 2020-1-3 19:46
wjy961121 发表于 2020-1-3 19:55
我是小白,想用这个学习
zhangbice 发表于 2020-1-6 08:52
这个很好,谢谢楼主
cj13888 发表于 2020-1-6 08:56
学习借鉴一下,谢谢分享
meng132meng 发表于 2020-2-10 10:11
楼主大哥,一直出现  SyntaxError: multiple statements found while compiling a single statement  咋回事
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 20:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表