在淘股吧发现有位大牛每天都有数据整理,地址:湖南人的博客
所以直接下载他的博客文章即可。
分析发现,他复盘的数据都是使用的图片,所以只需要把博客文章里面的图片下载到本地。
第一步:分析首页数据:
通过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()