源码地址
我这里使用selenium是为了爬取网页上的信息,爬取网页上的东西我这边暂且认为有两种方式,一种是针对没有JS的网页,这种情况用普通的get请求就可以爬;另一种是有JS的网页,这种如果不使用支持JS的框架,那么拿到的只是JS代码,所以这里就可以借助selenium这种本意为自动化测试而生的框架。
爬取没有JS的网页
可以用普通的get请求,拿到数据为网页的源代码,用正则表达式去匹配我们想要的东西。
也可以借助框架BeautifulSoup来解析网页源码(XML解析)
正则表达式爬取数据
# user/bin/env python3
# -*- coding:utf-8 -*-
from urllib import request
import re
# get网络请求
def getNetResquest(url):
with request.urlopen(url) as f:
data = f.read()
return data
class Spider:
def __init__(self):
self.siteURL = 'http://mm.taobao.com/json/request_top_list.htm' # 淘宝MM网页的URL
# 获取该页的网页数据
def getPage(self, pageIndex):
url = self.siteURL + "?page=" + str(pageIndex)
print(url)
response = getNetResquest(url)
return response.decode('gbk')
# 获取第几页的网页MM
def getContents(self, pageIndex):
page = self.getPage(pageIndex) # 获取到网页源码数据
pattern = re.compile('<div class="list-item".*?pic-word.*?<a href="(.*?)".*?<img src="(.*?)".*?<a class="lady-name.*?>(.*?)</a>.*?<strong>(.*?)</strong>.*?<span>(.*?)</span>', re.S) # 正则表达式,匹配我们想要的信息这里分别获取到MM的个人主页,头像的链接,姓名,年龄,城市
items = re.findall(pattern, page) # 用正则表达式,去匹配网页源码
for item in items: # 遍历匹配的结果,并打印出来
print(item[0], item[1], item[2], item[3], item[4]) # 分别对应MM的个人主页,头像的链接,姓名,年龄,城市
spider = Spider()
spider.getContents(1)
用bs4分析网页源码爬取数据
import requests
from bs4 import BeautifulSoup
index = 0
headers = {'referer': 'http://jandan.net/', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0'}
# 保存图片
def save_jpg(res_url):
global index
html = BeautifulSoup(requests.get(res_url, headers=headers).text) # 获取网页数据,并将其转换为beautifulsoup对象
for link in html.find_all('a', {'class': 'view_img_link'}): # 从网页源码里面抓取图片的链接
with open('{}.{}'.format(index, link.get('href')[len(link.get('href'))-3: len(link.get('href'))]), 'wb') as jpg: # 抓取链接里面图片的后缀,并新建新的图片文件
jpg.write(requests.get("http:" + link.get('href')).content) # 将图片保存在本地
print("正在抓取第%s条数据" % index)
index += 1
# 抓取煎蛋妹子图片,默认抓取5页
if __name__ == '__main__':
url = 'http://jandan.net/ooxx'
for i in range(0, 5):
save_jpg(url) # 下载图片
url = BeautifulSoup(requests.get(url, headers=headers).text).find('a', {'class': 'previous-comment-page'}).get('href') # 获取下一页的URL
爬取有JS代码的网页
这里使用selenium框架+Chrome浏览器。
首先需要配置我们的环境变量以及下载会用到的包
pip install selenium selenium Github地址
然后下载chromedriver注意的问题是chromedriver和Chrome的版本一定要相符,一般来说都是用最新的版本是没问题的,一般chromedriver也会说明支持的Chrome版本范围,
下载完成后,将chromedriver解压后的EXE文件复制到Chrome的目录下,如果在安装Chrome时没有另选路径的一般会是下面路径(这里的C作为系统盘)
C:\Users\DAMNICOMNIPLUSVIC\AppData\Local\Google\Chrome\Application
然后把该路径下面的chromedriver添加到环境变量的path里。
win+R->右键此电脑(计算机)->属性->高级系统设置->环境变量->编辑系统变量里面的path,添加
C:\Users\DAMNICOMNIPLUSVIC\AppData\Local\Google\Chrome\Application\;
然后在DOS窗口输入chromedriver看是否有打印信息。
然后写我们的Python代码
# user/bin/env python3
# -*- coding:utf-8 -*-
import os
import traceback
import requests
import sys
from selenium import webdriver
CURRENTPATH = os.path.split(os.path.realpath(sys.argv[0]))[0] # 获取该文件的绝对路径
# 根据提供的网址下载文件
def downloadImageFile(imgUrl):
local_filename = imgUrl.split('/')[-1] # 读取文件的名字
print("Download Image File=", local_filename)
r = requests.get(imgUrl, stream=True) # here we need to set stream = True parameter
os.makedirs(CURRENTPATH+'\\tuchong', exist_ok=True) # 创建一个新的文件夹
with open(CURRENTPATH+'\\tuchong\\'+local_filename, 'wb') as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk: # filter out keep-alive new chunks
f.write(chunk)
f.flush()
f.close()
return local_filename
class Spider:
def __init__(self):
self.driver = webdriver.Chrome() # 初始化这个类,这里仅仅指明了用哪个浏览器
def execute(self):
self.login() # 登录图虫
self.album('3') # 去到编号为3这个人的相册
def login(self):
self.driver.get('https://tuchong.com/') # 打开图虫网页
print(self.driver.title)
# login = self.driver.find_element_by_link_text('登录')
login = self.driver.find_element_by_xpath('/html/body/header/nav/div[2]/a[1]') # 找到图虫首页上面的登录按钮,这里采用的是xpath方式
print(login)
if not login is None: # 判断找到的登录按钮是否为空
login.click() # 点击登录按钮
self.driver.switch_to.alert # 将当前driver的焦点转移到弹出的对话框
account = self.driver.find_element_by_xpath('//*[@id="login-dialog"]/div/div/div/div[1]/form/div[2]/input') # 找到输入账号的输入框
password = self.driver.find_element_by_xpath('//*[@id="login-dialog"]/div/div/div/div[1]/form/div[3]/input') # 找到输入密码的输入框
loginbtn = self.driver.find_element_by_xpath('//*[@id="login-dialog"]/div/div/div/div[1]/form/div[6]/button') # 找到登录的按钮
account.send_keys('你的图虫账号') # 输入账号
password.send_keys('你的图虫账号密码') # 输入密码
loginbtn.click() # 点击登录
self.driver.refresh() # 刷新driver,让网页本身获取焦点
print(self.driver.title) # 打印标题
def album(self, num):
url = 'https://tuchong.com/%s/albums' % (str(num),) # 输入ID为num的账户的相册URL(因为上面已经登录了,所以这里不会要求重新登录)
self.driver.get(url)
self.driver.refresh() # 刷新driver获取当前网页的焦点
print(self.driver.title) # 打印当前网页的标题
albums = self.driver.find_elements_by_class_name('picture-wrap') # 找到用户的相册元素的集合(多个相册就有多个元素)
if True:
try:
albums[2].click() # 这里点击第三个相册
self.driver.refresh() # 获取当前页面的driver
images = self.driver.find_elements_by_class_name('post-cover') # 获取相册里面的图片集合
for image in images: # 挨个打开,图片大图(会在新的标签页打开大图)
image.click()
curhandle = self.driver.current_window_handle # 获取当前网页的把柄handle(网页)
print('main handle:', curhandle)
for handle in self.driver.window_handles: # 遍历当前浏览器打开的所有handle(网页)
print('handle:', handle)
if not handle == curhandle: # 遍历的handle(网页)与相册的网页handle作比较
self.driver.switch_to.window(handle) # 将driver的焦点转移到该大图网页
image = self.driver.find_element_by_class_name('copyright-contextmenu') # 找到图片所在的节点
src = image.get_attribute('src') # 从该节点里面取出图片的原地址链接
downloadImageFile(src) # 下载该图片
self.driver.close() # 关闭该网页,
print(src)
except:
traceback.print_exc()
self.driver.back()
self.driver.refresh()
self.driver.quit() # 所有的代码执行完,就退出这次程序
if __name__ == '__main__':
spider = Spider()
spider.execute()
然后执行就行了。