基于selenium爬取国赛建模优秀作品

一、基础环境

1.1版本环境

window10 + pycharm2019.3+python3.7

1.2依赖包

from selenium import webdriver
from selenium.webdriver import ChromeOptions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import csv
from selenium.webdriver.common.keys import Keys
import lxml
from lxml import etree
import os
import urllib.request
import json
import uuid
import random
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support import expected_conditions as EC
from fpdf import FPDF
from PIL import Image

1.3浏览器驱动

selenium加载浏览器环境需要下载对应的浏览器驱动,随便选择一个喜欢用的就可以了,但是优先推荐Chrome,这里我选择的也是Chrome。

下载地址:http://npm.taobao.org/mirrors/chromedriver/

注意:下载与直接浏览器版本相适应的

二、网页分析

目标网页: http://dxs.moe.gov.cn/zx/hd/sxjm/sxjmlw/2020qgdxssxjmjslwzs/
目标网页
进去之后我们可以发现我们需要爬取的文件在这里
目标文件地址
接着,我们再进去,结果我们发现,网站为了防止我们爬虫,将文件设置成了 图片的方式展示。
无
这估计是网站为了反爬虫设置的,即使我们将图片爬取下来了,其可阅读性将大大降低,但是我们不怕,秉着python爬虫的原则——>可见即可爬,我们可以利用python的第三方库PILFPDF,将图片合成pdf来阅读。
基本分析完毕,我们来进行代码操作

三、代码分析

3.1 反反爬虫操作

# 防止反爬虫
option = ChromeOptions()
option.add_argument('--headless')
#不显示窗口。速度更快
option.add_experimental_option('excludeSwitches', ['enable-automation'])

3.2声明浏览器对象

# 声明浏览器对象
browser = webdriver.Chrome(options=option, executable_path=r'D:\Google\Chrome\Application\chromedriver.exe')

3.3获取目标文件的urls

url = "http://dxs.moe.gov.cn/zx/hd/sxjm/sxjmlw/2020qgdxssxjmjslwzs/"
browser.get(url)
Urls = []
try:
    Class_urls = browser.find_elements_by_xpath('//*[@class="three-tit"]/h4/a')
    for temp_urls in Class_urls:
        Urls.append(temp_urls.get_attribute("href"))
except NoSuchElementException:
    print('没找到')
    # 找到所有文章的urls

3.4 获取图片的urls

for Article_url in Urls:
    Img_urls = []  # 保存图片的地址
    browser.get(Article_url)  # 访问文章的地址
    Article_title = browser.find_element_by_xpath('/html/body/div[1]/div[3]/div[1]/div[2]').get_attribute("textContent")
    print(Article_title)
    try:
        ariticle_urls = browser.find_elements_by_xpath('//*[@class="imgslide-wra"]/img')
        for temp_urls in ariticle_urls:
            Img_urls.append(temp_urls.get_attribute("src"))
    except NoSuchElementException:
        print('没找到')

3.5下载文件

def download(url, name, path):
    if not os.path.exists(path):
        os.makedirs(path)
    # with open(path + str(name) + '.jpg', 'wb') as file:
    #     file.write(urllib.request.urlopen(url).read())
    # file.close()
    urllib.request.urlretrieve(url, path + name + '.jpg')
    print("%s图片下载成功" % name)

3.6 处理图片

def makePdf(pdfName, title,i):  # listPages,以列表形式传入,方便批量合成
    # listimgage需要重新处理,得到绝对路径
    cover = Image.open(path + title.strip()+str(i)+ '.jpg')
    width, height = cover.size
    pdf = FPDF(unit="pt", format=[width, height])
    for j in range(1,i+1):
        pdf.add_page()
        pdf.image(path + title.strip()+str(j)+ '.jpg', 0, 0)
    pdf.output(pdfName, "F")

四、结果展示

结果展示

五、完整代码

from selenium import webdriver
from selenium.webdriver import ChromeOptions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import csv
from selenium.webdriver.common.keys import Keys
import lxml
from lxml import etree
import os
import urllib.request
import json
import uuid
import random
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support import expected_conditions as EC
from fpdf import FPDF
from PIL import Image

path = 'D:/Desktop/国赛优秀论文/图片/'
Oringin_url = 'http://dxs.moe.gov.cn/'

def del_file(path):
    ls = os.listdir(path)
    for i in ls:
        c_path = os.path.join(path, i)
        if os.path.isdir(c_path):
            del_file(c_path)
        else:
            os.remove(c_path)

def makePdf(pdfName, title,i):  # listPages,以列表形式传入,方便批量合成
    # listimgage需要重新处理,得到绝对路径
    cover = Image.open(path + title.strip()+str(i)+ '.jpg')
    width, height = cover.size
    pdf = FPDF(unit="pt", format=[width, height])
    for j in range(1,i+1):
        pdf.add_page()
        pdf.image(path + title.strip()+str(j)+ '.jpg', 0, 0)
    pdf.output(pdfName, "F")

def download(url, name, path):
    if not os.path.exists(path):
        os.makedirs(path)
    # with open(path + str(name) + '.jpg', 'wb') as file:
    #     file.write(urllib.request.urlopen(url).read())
    # file.close()
    urllib.request.urlretrieve(url, path + name + '.jpg')
    print("%s图片下载成功" % name)


# 防止反爬虫
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
# option.add_argument('--headless')

# 声明浏览器对象
browser = webdriver.Chrome(options=option, executable_path=r'D:\Google\Chrome\Application\chromedriver.exe')

url = "http://dxs.moe.gov.cn/zx/hd/sxjm/sxjmlw/2020qgdxssxjmjslwzs/"
browser.get(url)
Urls = []
try:
    Class_urls = browser.find_elements_by_xpath('//*[@class="three-tit"]/h4/a')
    for temp_urls in Class_urls:
        Urls.append(temp_urls.get_attribute("href"))
except NoSuchElementException:
    print('没找到')
# 找到所有文章的urls
# 进入文章,获取文章的src图片地址

for Article_url in Urls:
    Img_urls = []  # 保存图片的地址
    browser.get(Article_url)  # 访问文章的地址
    Article_title = browser.find_element_by_xpath('/html/body/div[1]/div[3]/div[1]/div[2]').get_attribute("textContent")
    print(Article_title)
    try:
        ariticle_urls = browser.find_elements_by_xpath('//*[@class="imgslide-wra"]/img')
        for temp_urls in ariticle_urls:
            Img_urls.append(temp_urls.get_attribute("src"))
    except NoSuchElementException:
        print('没找到')
    i = 0
    for src_url in Img_urls:
        i += 1
        # 下载图片
        download(src_url, Article_title.strip() + str(i), path)
    # 转化成pdf
    makePdf("D:/Desktop/国赛优秀论文/"+Article_title.strip()+'.pdf',  Article_title.strip(),i)
    print(Article_title.strip() +"下载成功")
    #del_file("D:/Desktop/国赛优秀论文/图片")#删除文件,避免干扰
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鵬哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值