网络爬虫相关知识
2019-12-23 本文已影响0人
wangyu2488
2019年12月19日
一.爬取数据
image.png二.使用urllib爬取数据
image.png1.获取静态数据
"""获得静态数据"""
import urllib.request
url = 'https://www.nasdaq.com/symbol/aapl/historical#.UWdnJBDMhHk'
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as response:
data = response.read()
htmlstr = data.decode()
print(htmlstr)
image.png
2.获取动态数据
http://q.stock.sohu.com/cn/600519/lshq.shtml
2.1获取动态请求链接
image.png2.2查看网页编码格式
image.png2.3.实现数据抓包处理
"""获得动态数据"""
import urllib.request
url = 'http://q.stock.sohu.com/hisHq?code=cn_600519&stat=1&order=D&period=d&callback=historySearchHandler&rt=jsonp&0.8115656498417958'
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as response:
data = response.read()
htmlstr = data.decode('gbk')
print(htmlstr)
htmlstr = htmlstr.replace('historySearchHandler(', '')
htmlstr = htmlstr.replace(')', '')
print('替换后的:', htmlstr)
image.png
image.png
3.伪装成浏览器
# coding=utf-8
import urllib.request
url = 'http://www.ctrip.com/'
req = urllib.request.Request(url)
req.add_header('User-Agent',
'Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Version/10.0 Mobile/14D27 Safari/602.1')
with urllib.request.urlopen(req) as response:
data = response.read()
htmlstr = data.decode()
if htmlstr.find('mobile') != -1:
print('移动版')
image.png
三.使用Selenium爬取数据【操控浏览器做事情】
1.安装
image.png1.1安装selenium
pip install selenium
image.png这么这个会自动添加 不需要单独设置
image.png1.2.兼容问题 要下载GeckoDriver
方法1:https://github.com/mozilla/geckodriver/releases
image.png方法2:推荐
brew install geckodriver
image.png如有问题可以设置下环境变量,(应为以前设置过了,其实可以不用设置了)
image.png2.使用
2.1.常用API
image.png image.png image.png image.png2.2 具体使用
抓取指定指定数据
# coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('http://q.stock.sohu.com/cn/600519/lshq.shtml')
em = driver.find_element_by_id('BIZ_hq_historySearch')
print(em.text)
# driver.close()
driver.quit()
效果:会自动打开火狐浏览器
image.png预计2分钟左右下面数据就会出来了
image.png四.分析数据
1.使用正则表达式
eg1:将指定网站,指定格式的图片下载下来
# coding=utf-8
import urllib.request
import os
import re
url = 'http://p.weather.com.cn/'
def findallimageurl(htmlstr):
"""从HTML代码中查找匹配的字符串"""
# 定义正则表达式
pattern = r'http://\S+(?:\.png|\.jpg)'
return re.findall(pattern, htmlstr)
def getfilename(urlstr):
"""根据图片连接地址截取图片名"""
pos = urlstr.rfind('/')
return urlstr[pos + 1:]
# 分析获得的url列表
url_list = []
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as response:
data = response.read()
htmlstr = data.decode()
url_list = findallimageurl(htmlstr)
for imagesrc in url_list:
# 根据图片地址下载
req = urllib.request.Request(imagesrc)
with urllib.request.urlopen(req) as response:
data = response.read()
# 过滤掉用小于100kb字节的图片
if len(data) < 1024 * 100:
continue
# 创建download文件夹
if not os.path.exists('download'):
os.mkdir('download')
# 获得图片文件名
filename = getfilename(imagesrc)
filename = 'download/' + filename
# 保存图片到本地
with open(filename, 'wb') as f:
f.write(data)
print('下载图片', filename)
image.png
2.使用BeautifulSoup库 (推荐使用,有标签的概念)
2.1安装
pip install beautifulsoup4
image.png2.2 常用API
image.png image.png2.3 使用
# coding=utf-8
import os
import urllib.request
from bs4 import BeautifulSoup
url = 'http://p.weather.com.cn/'
def findallimageurl(htmlstr):
"""从HTML代码中查找匹配的字符串"""
sp = BeautifulSoup(htmlstr, 'html.parser') #html.parser html.parser
# 返回所有的img标签对象
imgtaglist = sp.find_all('img')
# 从img标签对象列表中返回对应的src列表
srclist = list(map(lambda u: u.get('src'), imgtaglist))
# 过滤掉非.png和.jpg结尾文件src字符串
filtered_srclist = filter(lambda u: u.lower().endswith('.png')
or u.lower().endswith('.jpg'), srclist)
return filtered_srclist
def getfilename(urlstr):
"""根据图片连接地址截取图片名"""
pos = urlstr.rfind('/')
return urlstr[pos + 1:]
# 分析获得的url列表
url_list = []
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as response:
data = response.read()
htmlstr = data.decode()
url_list = findallimageurl(htmlstr)
for imagesrc in url_list:
# 根据图片地址下载
req = urllib.request.Request(imagesrc)
with urllib.request.urlopen(req) as response:
data = response.read()
# 过滤掉用小于100kb字节的图片
if len(data) < 1024 * 100:
continue
# 创建download文件夹
if not os.path.exists('download'):
os.mkdir('download')
# 获得图片文件名
filename = getfilename(imagesrc)
filename = 'download/' + filename
# 保存图片到本地
with open(filename, 'wb') as f:
f.write(data)
print('下载图片', filename)
image.png
如果您发现本文对你有所帮助,如果您认为其他人也可能受益,请把它分享出去。