目录
1.网络爬虫
6.Chrome浏览器插件
7.Filldler抓包工具
8.Anaconda 和 spyder
9.WEB
10.爬虫请求模块
11.作业
1.定义:网络蜘蛛 网络机器人 ,抓取网络数据的程序
2.总结:用python程序去模仿人去访问网站,模仿的越逼真越好
3.目的:通过有效的大量的数据分析市场走势,公司的决策
2.企业获取数据的方式
1.公司自有
2.第三方数据平台购买
数据堂 贵阳大数据交易所
3.爬虫爬取数据
市场上没有或者价格太高,利用爬虫程序去爬取
3.python做爬虫的优势
python:请求模块,解析模块丰富成熟
PHP:对多线程,异步支持不够好
JAVA: 代码笨重,代码量大
C/C++:虽然效率高,但是代码成型太慢
4.爬虫的分类
1.通用的网络爬虫(搜索引擎引用,需要遵守robots协议)
1.搜索引擎如何获取一个新网站的url
1.网站主动向搜索引擎提供(百度站长平台)
2.和DNS服务商(万网),快速收录新网站
2.聚焦网络爬虫
自己写的爬虫程序:面向主题爬虫 面向需求爬虫
爬虫 反爬虫 反反爬虫
5.爬取数据步骤
1.确定需要爬取的url地址
2.通过HTTP/HTTPS协议来获取响应的HTML页面
3.提取HTML页面里有用的数据
1.所需数据,保存
2.页面中其他的URL,继续 2 步
1.插件安装
1.右上角-更多工具-扩展程序
2.点开 开发者模式
3.把插件退拽到浏览器界面
2.插件介绍
1.Proxy SwitchOmega:代理切换插件
2.XPath Helper:网页数据解析插件
3.JSON View:查看json格式的数据(好看)
1.抓包设置
1.设置Filldler抓包工具
2.设置浏览器代理
1.anaconda:开源的python发行版本
2.Spyder:集成的开发环境
spyder常用快捷键
1.注释/取消注释:ctrl+1
2.保存:ctrl+s
3.允许程序:F5
1.HTTP 和 HTTPS
1.HTTP:80
2.HTTPS:443 HTTP的升级版
2.GET 和 POST
1.GET:查询参数会在URL上显示出来
2.POST:查询参数和提交数据在form表单里,不会再URL地址上显示
3.URL
http:// item.jd.com :80 /26606127795.html #detail
协议 域名/IP地址 端口 要访问的资源路径 锚点
4.User-Agent
记录用户的浏览器,操作系统等,为了让用户获取更好的HTML页面效果
Mozilla : Firefox(Gecko内核)
IE : Trident()
Linux : KHTML(like Gecko)
Apple : Webkit(like KHTML)
google : Chrome(like webkit)
1. urllib.request
1.版本
1.python2中:urllib 和 urllib
2.python3中:把两者合并,urllib.request
2.常用方法
1.urllib.request.urlopen("url")
作用:向网站发起请求并获取响应
import urllib.request
url = "http://www.baidu.com/"
# 发起请求并获取响应对象
response = urllib.request.urlopen(url)
# 响应对象的read()方法获取响应内容
# read()得到的是 bytes 类型
# decode() bytes -> string
html = response.read().decode("utf-8")
print(html)
2、urllib.request.Request(url,headers={})
1、重构User-Agent,爬虫和反爬虫斗争第一步
2、使用步骤
1、构建请求对象request :Request()
2、获取响应对象response :urlopen(request)
3、利用响应对象response.read().decode("utf-8")
import urllib.request
url = "http://www.baidu.com/"
headers = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
# 1.构建请求对象
request = urllib.request.Request(url,headers=headers)
# 2.获取响应对象
response = urllib.request.urlopen(request)
# 3.获取响应对象内容
html = response.read().decode("utf-8")
# 获取响应码
print(response.getcode())
# 获取响应报头信息
print(response.info())
3. 请求对象request方法
1. add_header()
作用 : 添加/修改headers(User-Agent)
2. get_header("User-agent") : 只有U是大写
作用 : 获取已有的HTTP报头的值
import urllib.request
url = "http://www.baidu.com/"
headers = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"
# 1.构建请求对象
request = urllib.request.Request(url)
# 请求对象方法 add_header()
request.add_header("User-Agent",headers)
# 获取响应对象
response = urllib.request.urlopen(request)
# get_header()方法获取 User-Agent
print(request.get_header("User-agent"))
4. 响应对象response方法
1. read() : 读取服务器响应的内容
2. getcode()
作用 : 返回HTTP的响应码
200 : 成功
4XX : 服务器页面出错
5XX : 服务器出错
3. info()
作用 : 返回服务器响应的报头信息
2.urllib.parse
1.quote("中文") 见:04_quote编码.py
2.urlencode(字典)
url : wd="美女"
d = {"wd":"美女"}
d = urllib.parse.urlencode(d)
print(d)
结果 : wd=%E7%BE%8E%E5%A5%B3
3.unquote("编码之后的字符串")
import urllib.request
import urllib.parse
headers = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
url = "http://www.baidu.com/s?wd="
key = input("请输入要搜索的内容:")
# 编码,拼接URL
key = urllib.parse.quote(key)
fullurl = url + key
# 构建请求对象
request = urllib.request.Request(fullurl,headers=headers)
# 获取响应对象
response = urllib.request.urlopen(request)
# read().decode()
html = response.read().decode("utf-8")
print(html)
import urllib.request
import urllib.parse
baseurl = "http://www.baidu.com/s?"
headers = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
key = input("请输入要搜索的内容:")
# urlencode编码,参数一定要是字典
d = {"wd":key}
d = urllib.parse.urlencode(d)
url = baseurl + d
# 构建请求对象
request = urllib.request.Request(url,headers=headers)
# 获取响应对象
response = urllib.request.urlopen(request)
# 获取内容
html = response.read().decode("utf-8")
print(html)
3.百度贴吧数据抓取
要求:
1.输入贴吧的名称
2.输入抓取的起始页和终止页
3.把每一页的内容保存到本地:第1页.html 第2页.html
步骤:
1. 找URL规律(拼接URL)
第1页 :http://tieba.baidu.com/f?kw=达内&pn=0
第2页 :http://tieba.baidu.com/f?kw=达内&pn=50
第3页 :http://tieba.baidu.com/f?kw=达内&pn=100
第n页 :pn=(n-1)*50
2. 获取响应内容
3. 保存到本地/数据库
# 数据抓取
import urllib.request
import urllib.parse
baseurl = "http://tieba.baidu.com/f?"
headers = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
name = input("请输入贴吧名:")
begin = int(input("请输入起始页:"))
end = int(input("请输入终止页:"))
# URL进行编码
kw = {"kw":name}
kw = urllib.parse.urlencode(kw)
# 写循环拼接URL,发请求获响应,写入本地文件
for page in range(begin,end+1):
# 拼接URL
pn = (page-1)*50
url = baseurl + kw + "&pn=" + str(pn)
# 发请求,获响应
req = urllib.request.Request(url,headers=headers)
res = urllib.request.urlopen(req)
html = res.read().decode("utf-8") # 字符串
# 写文件/保存到本地
filename = "第" + str(page) + "页.html"
with open(filename,"w",encoding="utf-8") as f:
print("正在下载第%d页" % page)
f.write(html)
print("第%d页下载成功" % page)
print("*" * 30)
# 封装成类后
import urllib.request
import urllib.parse
class BaiduSpider:
def __init__(self):
self.baseurl = "http://tieba.baidu.com/f?"
self.headers = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
# 请求并读取页面内容
def getPage(self,url):
req = urllib.request.Request(url,headers=self.headers)
res = urllib.request.urlopen(req)
html = res.read().decode("utf-8")
return html
# 保存到本地文件
def writePage(self,filename,html):
with open(filename,"a",encoding="utf-8") as f:
f.write(html)
# 主函数
def workOn(self):
name = input("请输入贴吧名:")
begin = int(input("请输入起始页:"))
end = int(input("请输入终止页:"))
kw = {"kw":name}
kw = urllib.parse.urlencode(kw)
for page in range(begin,end+1):
pn = (page-1) * 50
url = self.baseurl + kw + "&pn=" + str(pn)
print("正在下载第%d页" % page)
html = self.getPage(url)
filename = "第" + str(page) + "页.html"
self.writePage(filename,html)
print("第%d页下载成功" % page)
if __name__ == "__main__":
# 创建对象
spider = BaiduSpider()
# 对象调用类内方法
spider.workOn()
1、爬取猫眼电影top100榜
1、程序运行,直接爬取第1页
2、是否继续爬取(y/n):
y :爬取第2页
n :爬取结束,谢谢使用
3、把每一页的内容保存到本地 第1页.html ...
普通版 && 类
2、步骤
1、URL
2、获取响应内容
3、写入本地
import urllib.request
import re
class MaoYanSpider:
def __init__(self):
self.headers = {"User-Agent":"Mozilla4.0/"}
self.page = 1
self.offset = 0
self.baseurl = "http://maoyan.com/board/4?offset="
# 获取html源码
def getPage(self,url):
req = urllib.request.Request(url,headers=self.headers)
res = urllib.request.urlopen(req)
html = res.read().decode("utf-8")
return html
# 正则解析html源码
def parsePage(self,html):
p = re.compile('.*?title="(.*?)".*?class="star">(.*?).*?class="releasetime">(.*?).*?',re.S)
content_list = p.findall(html)
# [("霸王别姬","张国荣","1993"),(),()]
return content_list
# 写入本地文件
def writePage(self,content_list):
for m_tuple in content_list:
for n_str in m_tuple:
with open("猫眼电影.txt","a",encoding="utf-8") as f:
f.write(n_str.strip() + "\n")
with open("猫眼电影.txt","a",encoding="utf-8") as f:
f.write("\n\n")
# 主函数
def workOn(self):
while True:
url = self.baseurl + str(self.offset)
print("正在爬取第%d页" % self.page)
html = self.getPage(url)
content_list = self.parsePage(html)
self.writePage(content_list)
print("第%d页爬取成功" % self.page)
c = input("是否继续爬取(y/n):")
if c.strip().lower() == "y":
self.offset += 10
self.page += 1
else:
print("爬取结束,谢谢使用!")
break
if __name__ == "__main__":
spider = MaoYanSpider()
spider.workOn()