- 定义:
1. 爬虫是一种网络数据的程序。
2. 其实就是用Python程序模仿人点击浏览器并访问网站,而且模仿的越像越好,让Web站点无法发现你不是人。 - 爬取数据的目的:
1. 测试数据
2. 公司业务部门及其他部门所需要的数据
3. 数据分析 - 企业获取数据方式
1. 自有数据
2. 第三方数据平台购买
3. 爬虫爬取数据 - 爬虫的优势:
1. Python :请求模块、解析模块丰富成熟,强大的Scrapy网络爬虫框架。 - 爬虫的分类:
1. 通用网络爬虫(搜索引擎使用,遵守robots协议)
robots协议 :网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,通用网络爬虫需要遵守robots协议(君子协议) https://www.taobao.com/robots.txt;
2. 聚焦网络爬虫 :自己写的爬虫程序。 - 爬虫爬取数据步骤:
1. 确定需要爬取的URL地址;
2. 由请求模块向URL地址发出请求,并得到网站的响应;
3. 从响应内容中利用解析模块提取所需数据:
(1). 所需数据,保存;
(2). 页面中有其他需要继续跟进的URL地址,继续第2步去发请求,如此循环.
简单来说:就是【请求 解析 保存!】 - pycharm实现爬虫:
import urllib.request
#像****发起请求,并获取响应对象
resp = urllib.request.urlopen('http://www.****.com/')
#获取响应对象的内容 resp的方法:
html = resp.read().decode() #decode bytes——> string
#返回http的响应码
code= resp.getcode()
#获取返回实际数据的url
url = resp.geturl()
print(code,url)
打印结果:
****首页的源代码。
200 http://www.****.com/
- 包装请求头:User-Agent
https://www.cnblogs.com/zrmw/p/9332801.html 获取请求头。这是爬虫与反爬虫的首要操作:
from urllib import request
#定义常用变量
url = 'http://httpbin.org/get'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'}
#像百度发起请求
rep = request.Request(url=url,headers=headers)
#发起请求获得响应对象
resp = request.urlopen(rep)
#提取响应内容
html = resp.read().decode()
print(html)
打印结果:
{
"args": {
},
"headers": {
"Accept-Encoding": "identity",
"Host": "httpbin.org",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0"
},
"origin": "183.131.110.99, 183.131.110.99",
"url": "https://httpbin.org/get"
}
- urlencode()字符串编码:
from urllib import request,parse
#拼接url地址
word = input('请输入搜索内容:')
params =parse.urlencode({
'wd':word})
url = 'http://www.baidu.com/s?{}'
url = url.format(params)
#发请求获取响应内容
headers = {
'User-Agent':'Mozilla/5.0'}
#1.发请求
rep = request.Request(url=url,headers=headers)
resp = request.urlopen(rep)
#2.拿响应对象中的内容
html = resp.read().decode()
#保存到本地文件
filename = word +'.html'
with open(filename,'w') as f:
f.write(html)
运行结果:
请输入搜索内容:花千骨
和 创建了一个**.html文件
或者使用quote完成以上操作:
from urllib import request,parse
#拼接url地址
word = input('请输入搜索内容:')
params =parse.quote(word)
url = 'http://www.baidu.com/s?wd={}'
url = url.format(params)
#发请求获取响应内容
headers = {
'User-Agent':'Mozilla/5.0'}
#1.发请求
rep = request.Request(url=url,headers=headers)
resp = request.urlopen(rep)
#2.拿响应对象中的内容
html = resp.read().decode()
#保存到本地文件
filename = word +'.html'
with open(filename,'w') as f:
f.write(html)
word = parse.unquote(params) #解码操作
两段代码完成相同的工作。
- 文件抓取:
- 查看是不是静态页面(是);
- 查看网页源代码,你想查询的内容在不在(在);
- url地址缩减测试(http://*.com/?kw=&pn=***);
- 点击下一页找规律;
- 代码实现
from urllib import request,parse
import time
import random
from useragents import ua_list #自制一个header池
class TiebaSpider(object):
def __init__(self):
self.url ='http://tieba.baidu.com/f?kw={}&pn={}'
#1.请求:获取响应的html
def get_html(self,url):
headers = {
'User-Agent': random.choice(ua_list)}
req = request.Request(url=url,headers=headers)
#前两步,简单的实现伪装
resp = request.urlopen(req)
html =resp.read().decode()
return html
#2.解析
def parse_html(self):
pass
#3.保存
def save_html(self,filename,html):
with open(filename,'w') as f:
f.write(html)
#4.入口函数
def run(self):
name = input('请输入贴吧名:')
begin = int(input('请输入起始页:'))
end = int(input('请输入终止页:'))
params = parse.quote(name)
#拼接地址,发请求,保存
for page in range(begin,end+1):
pn = (page-1)*50
url= self.url.format(params,pn)
html =self.get_html(url)
filename = name + '-第%s页.html'%str(page)
self.save_html(filename,html)
print('第%d页抓取成功'%page)
# time.sleep(random.randint(1,2))
time.sleep(random.uniform(0,1)) #生成浮点数
if __name__ == '__main__':
spider =TiebaSpider()
spider.run()
-
sudo pip3 install fake_useragent
from urllib import request,parse
import time
import random
from fake_useragent import UserAgent
class TiebaSpider(object):
def __init__(self):
self.url ='http://tieba.baidu.com/f?kw={}&pn={}'
#1.请求:获取响应的html
def get_html(self,url):
headers = {
'User-Agent': UserAgent().random } #简单的破解反爬机制
req = request.Request(url=url,headers=headers)
resp = request.urlopen(req)
html =resp.read().decode()
return html
#2.解析
def parse_html(self):
pass
#3.保存
def save_html(self,filename,html):
with open(filename,'w') as f:
f.write(html)
#4.入口函数
def run(self):
name = input('请输入贴吧名:')
begin = int(input('请输入起始页:'))
end = int(input('请输入终止页:'))
params = parse.quote(name)
#拼接地址,发请求&#