老鱼Python数据分析——篇十二:使用selenium+BeautifulSoup获取淘股吧数据 - Go语言中文社区

老鱼Python数据分析——篇十二:使用selenium+BeautifulSoup获取淘股吧数据


在淘股吧发现有位大牛每天都有数据整理,地址:湖南人的博客

所以直接下载他的博客文章即可。

分析发现,他复盘的数据都是使用的图片,所以只需要把博客文章里面的图片下载到本地。

第一步:分析首页数据:

 通过blogs = self.browser.find_elements_by_css_selector(".article_tittle"),可以得到首页的文章列表,点击超链接跳转到内容页。

第二步,分析内容页数据:

 找到上图DIV中的所有图片,然后下载即可。


实现代码如下:

一、打开首页,遍历文章列表

二、根据文章列表打开文章详情页

三、找到详情页中的内容区域,并下载图片

from selenium import webdriver
from bs4 import BeautifulSoup
import common.mysql_oper as mysql
import os
import time
import urllib
import random
import requests

class TaoGuBa():
    heads = {'User-Agent': "Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"}
    taoguba_path = "agudata\taoguba\"      # 保存数据的目录
    # 创建浏览器对象,使用chrome浏览器的headless模式(无窗体模式)
    chrome_options = webdriver.chrome.options.Options()
    chrome_options.add_argument("--headless")
    browser = webdriver.Chrome(chrome_options=chrome_options)
    # browser  = webdriver.Chrome()
    #################################################
    # 创建目录和复盘数据文件
    def create_path(self):
        # 如果目录不存在,则创建目录
        if ( not os.path.exists(self.taoguba_path)):
            os.mkdir(self.taoguba_path)
    #################################################
    # 得到5个可用代理IP
    def get_iplist(self):
        iplist = []
        # 每次验证1条记录
        result = mysql.select("select ipurl from iptbl where state=1")
        for row in result:
            proxy = row[0]
            # 验证代理IP是否可用,如果IP不可用会抛异常
            try:
                proxies = {"http": proxy}
                urlList = ["http://www.qq.com", "http://www.jd.com", "http://www.baidu.com", "http://www.csdn.net",
                           "http://www.qidian.com", "http://www.51cto.com"]
                tmpUrl = random.choice(urlList)
                rsp = requests.get(tmpUrl, headers=self.heads, proxies=proxies, timeout=3)
                # 如果不可用则删除
                if (rsp.status_code != 200):
                    sql = "delete from iptbl where ipurl='" + proxy + "'"
                    mysql.exec(sql)
                    print("删除了" + proxy)
                else:
                    iplist.append(proxy)
                    if(len(iplist)==5):
                        return iplist
            except Exception as e:
                sql = "delete from iptbl where ipurl='" + proxy + "'"
                mysql.exec(sql)
                print("删除了" + proxy)
                pass
        return iplist
    #################################################
    # ————遍历博客文章详情页————
    def read_blogs(self, bloglist):
        iplist = self.get_iplist()
        i = 0
        for blog in bloglist:
            proxies = {"http": iplist[i]}
            i = (i+1 if i+1<len(iplist) else 0)
            response = requests.get(blog, headers=self.heads, proxies=proxies)
            soup = BeautifulSoup(response.content.decode("utf-8"), "lxml")
            title = soup.title.string

            # 如果目录不存在,则创建目录
            filepath = self.taoguba_path + title.split("_")[0] + "\"
            if (not os.path.exists(filepath)):
                os.mkdir(filepath)
                self.save_imgs(filepath, soup)
                time.sleep(1)
            else:
                print("更新文章已下载完毕!")
                break
    # ————保存指内容(首贴中的所有图片)————
    def save_imgs(self, filepath, soup):
        # 保存博客所有图片
        print(filepath + "==>下载中...")
        imglist = soup.find("div", attrs={"id": "first"}).find_all("img")
        i = 1
        for img in imglist[1:]:
            src = img.get("data-original")
            save_src = filepath + str(i) + ".png"
            urllib.request.urlretrieve(src, save_src)
            i += 1
        print("下载完成")
    #################################################
    #################################################
    # 打开首页,遍历文章列表
    def start(self):
        self.create_path()
        self.browser.get("https://www.taoguba.com.cn/blog/444409")  # 打开“湖南人”的博客
        self.browser.refresh()          #刷新一次,消除全屏广告
        # 遍历首页文章
        bloglist = []
        blogs = self.browser.find_elements_by_css_selector(".article_tittle")
        for blog in blogs:
            a = blog.find_element_by_tag_name("a")
            filepath = self.taoguba_path + a.text + "\"
            bloglist.append(a.get_attribute("href"))
        self.read_blogs(bloglist)
        self.browser.quit()
    #################################################

if __name__ == "__main__":
    tgb = TaoGuBa()
    tgb.start()

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/xy229935/article/details/90176607
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-13 13:40:42
  • 阅读 ( 1998 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢