文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

selenium爬取博客园文章保存到mysql并自动发布

2023-01-30 22:08

关注

分析目标网站:https://www.cnblogs.com/

爬取的内容是编程语言里面的python技术文章

image.png


它这里是有js动态加载的标签,而且经过观察()里面的数字是会随机变化的,并不是写死的(推测是一种防爬虫策略)。

如何解决呢?

直接获取标签的text文本内容,然后在把text内容赋值给xpath(标签选择器),这样不管数字如何变化,得到的都是最新的数字,话不多说,直接上代码:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time


browser = webdriver.Chrome()
http = 'https://www.cnblogs.com/'
browser.get(http)
browser.implicitly_wait(20)
# 找到编程语言标签的content
label_content=browser.find_element_by_xpath("//div[@id='cate_title_block']/ul/li[@id='cate_item_2']/a").text
print(label_content)

# 模拟鼠标悬停加载js,获取下级目录的标签
label_xpath = "//div[@id='cate_title_block']//li/a[text()='{}']".format(label_content)
print(label_xpath)
ActionChains(browser).move_to_element(browser.find_element_by_xpath(label_xpath)).perform()


# 找到python标签的content
# 创建一个空的list,把text的值追加进来
list_tmp = []
list_new = []
for i in browser.find_elements_by_xpath("//div[@class='cate_content_block']/ul/li/a"):
    list_tmp.append(i.text)
# 去重和去除''内容
for i in list_tmp:
    if i not in list_new and i != '':
        list_new.append(i)
print(list_new)

# 模拟点击python标签
python_xpath = "//div[@class='cate_content_block']/ul/li/a[text()='{}']".format(list_new[4])
browser.find_element_by_xpath(python_xpath).click()

browser.quit()


运行程序效果:

1111.gif


可以看到自动点击到python技术文章那里了,这样写不管编程语言(45)还是python(13),  ()里面的数字怎么变,都不会影响程序的运行。

搞定了前面,接下来就是爬取对应文章的title和url了,这里还涉及到数据整合,优化上面的代码,加上日志功能,完整代码如下:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from mylog import MyLog as mylog
import time


class GetCnblogs:
    def __init__(self, url):
        self.log = mylog()  # 实例化mylog类,用于记录日志
        self.url = url
        self.browser = self.setup_browser(self.url)
        self.simulated_click(self.browser)

    def setup_browser(self, url):
        """
        打开目标网站 https://www.cnblogs.com/
        :return: browser
        """
        try:
            # 创建chrome参数对象
            browser = webdriver.Chrome()
            # 利用selenium打开网站
            browser.get(url)
            # 等待网站js代码加载完毕
            browser.implicitly_wait(20)
        except Exception as e:
            # 记录错误日志
            self.log.error('打开目标网站失败:{},错误代码:{}'.format(url, e))
        else:
            # 记录成功日志
            self.log.info('打开目标网站成功:{}'.format(url))
            # 返回实例化selenium对象
            return browser

    def simulated_click(self, browser):
        # 找到编程语言标签的content
        label_content = browser.find_element_by_xpath("//div[@id='cate_title_block']/"
                                                      "/ul/li[@id='cate_item_2']/a").text
        # 模拟鼠标悬停加载js,获取下级目录的标签
        label_xpath = "//div[@id='cate_title_block']//li/a[text()='{}']".format(label_content)
        ActionChains(browser).move_to_element(browser.find_element_by_xpath(label_xpath)).perform()
        # 找到python标签的content, 创建两个空的list
        list_tmp = []  # 临时的列表,用于保存text内容
        list_new = []  # 用于去重和去除''内容
        for i in browser.find_elements_by_xpath("//div[@class='cate_content_block']/ul/li/a"):
            list_tmp.append(i.text)
        # 去重和去除''内容
        for i in list_tmp:
            if i not in list_new and i != '':
                list_new.append(i)

        # 模拟点击python标签
        python_xpath = "//div[@class='cate_content_block']/ul/li/a[text()='{}']".format(list_new[4])
        browser.find_element_by_xpath(python_xpath).click()

        # 获取文章title和url地址
        title_list = []
        url_list = []
        title_url_dict = {}
        for i in browser.find_elements_by_xpath("//div[@class='post_item']/div[@class='post_item_body']/h3/a"):
            title_list.append(i.text)
        for i in browser.find_elements_by_xpath("//div[@class='post_item']/div[@class='post_item_body']/h3/a"):
            url_list.append(i.get_attribute('href'))
        # 数据合并: title_list标题列表, url_list网站地址列表
        i = 1
        for x in title_list:
            title_url_dict.setdefault(i)
            title_url_dict[i] = {'title': x, 'url': None}
            i += 1
        s = 1
        for y in url_list:
            title_url_dict[s]['url'] = y
            s += 1
        # 记录title,url信息
        for i in title_url_dict:
            self.log.info("\n正在获取第{}篇文章\n标题为:{}\nURL地址:{}/"
                          "".format(i, title_url_dict[i]['title'], title_url_dict[i]['url']))
        time.sleep(5)
        browser.quit()


if __name__ == '__main__':
    url = 'https://www.cnblogs.com/'
    st = GetCnblogs(url)

pycharm运行截图

image.png


接下来获取每篇文章的具体内容,样式,图片

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯