python爬虫小case
学习网站:http://c.biancheng.net/python_spider/user-agent.html
重构UA实现反爬
#重构UA实现反爬
from urllib import request;
url='http://httpbin.org/get';
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:65.0) Gecko/20100101 Firefox/65.0'};#自己定义一个头,欺骗浏览器我不是机器人在访问
req = request.Request(url=url,headers=headers);#Request用来重新构建UA
res = request.urlopen(req);
html=res.read().decode('utf-8');#返回来的page是bytes,需要decode解码转为str
print(html);
引入库遇到的类似错误和解决手段:
https://www.codeleading.com/article/34813547277/
UA池
from fake_useragent import UserAgent;
ua=UserAgent();
#随机取一个ie信息
print(ua.ie);
#随机取一个火狐浏览器信息
print(ua.firework);
Python简单爬虫抓取网页
from urllib import request;
from urllib import parse
from fake_useragent import UserAgent
import ssl
#url address
url='http://www.baidu.com/s?wd={}'
word=input('please input something you want search:')
params=parse.quote(word)#quote把word全部转化为某一浏览平台可识别的形式
full_url=url.format(params)#把params传入到url中的{}中
#向url发送请求
# 构建请求头
UserAgent=UserAgent().ie
headers={'User-Agent':UserAgent}
# 关闭ssl认证
ssl._create_default_https_context = ssl._create_unverified_context
# 创建请求对应
req=request.Request(url=full_url,headers=headers)
# 获取响应对象
res=request.urlopen(req)
# 获取响应内容
html=res.read().decode('utf-8')
# 保存为本地文件
filename=word+'.html'
with open(filename,'w',encoding='utf=8') as f:
f.write(html)
访问的网站是https://,需要SSL认证,而直接用urllib会导致本地验证失败(具体原因未查明),所以使用ssl._create_unverified_context关闭认证
在使用urllib.request.Request(url)前,添加代码:
#在使用urllib.request.Request(url)前,添加代码
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
然后就能字啊同目录下看到一个这样的文件(输入的是编程帮)
Python爬虫抓取百度贴吧数据
from urllib import request,parse
from fake_useragent import UserAgent
import time,random,ssl
#全局取消证书验证
ssl._create_default_https_context = ssl._create_unverified_context
class TiebaSpider():
# 初始化url属性
#__init__()会在对象被实例化的时候调用
def __init__(self):
#python中可以不用声明url直接生成url属性并赋值
self.url='http://tieba.baidu.com/f?{}'
# 构造请求函数(java中对应方法),得到页面
# 三步走:1.得到html 2.解析 3.保存
def get_html(self,url):
print('this is random ua:',UserAgent().ie)
heards={'User-Agent':UserAgent().ie}
req=request.Request(url=url,headers=heards)
res=request.urlopen(req)
html=res.read().decode('gbk','ignore')
return html
def parse_html(self):
pass
def save_html(self,filename,html):
with open(filename,'w') as f:
f.write(html)
def run(self):
name=input('please input:')
begin=int(input('the start page:'))
stop=int(input("the stop page:"))
for page in range(begin,stop+1):
pn=(page-1)*50
params={'kw':name,'pn':str(pn)}
# 拼接url地址
params=parse.urlencode(params)
url=self.url.format(params)
#发请求
html=self.get_html(url)
filename='{}-{}页.html'.format(name,page)
self.save_html(filename,html)
#提示
print("第%d页抓取成功"%page)
# sleep()暂停给定描述后执行程序
# 没爬取一个页面随机休眠1-2秒的时间
time.sleep(random.randint(1,2))
if __name__=='__main__':
start=time.time()
spider=TiebaSpider()
spider.run()
end=time.time()
print('执行时间:%.2f'%(end-start))
python面向对象的爬虫模版
# 程序结构
class xxxSpider(object):
def __init__(self):
# 定义常用变量,比如url或计数变量等
def get_html(self):
# 获取响应内容函数,使用随机User-Agent
def parse_html(self):
# 使用正则表达式来解析页面,提取数据
def write_html(self):
# 将提取的数据按要求保存,csv、MySQL数据库等
def run(self):
# 主函数,用来控制整体逻辑
if __name__ == '__main__':
# 程序开始运行时间
spider = xxxSpider()
spider.run()