爬虫概念:按照一定规则,自动请求万维网,并获取网页内容
爬虫法律规范:robots君子协议
爬虫限制:非法不允许(密码 明令禁止的)
服务器会做什么:反爬(检查你的信息(修改头部信息);
速度(降低速度);半永久封号(代理ip);验证码)
爬虫的分类:通用爬虫和聚焦爬虫
爬虫为什么选择python语言
爬虫的原理:模拟的正常网站的使用
200 ;404 403 500
浏览器浏览网页的过程:
浏览器通过DNS域名服务器查找对应的ip地址
向ip地址对应的web服务器发送请求
web服务器响应请求,发回html页面
浏览器解析html内容,并显示出来
统一资源定位符url:http://127.0.0.1:8080/subject/python/project.shtml
协议头 服务器地址和端口 文件路径
http和https的区别:SSL
http默认端口80 https默认端口443
ip地址(http://180.97.33.107)—为每一台计算机提供一个编号,非常不容易记忆和理解
所以发明了域名(http://www.baidu.com)代替ip地址
域名和ip地址之间的对应关系表—DNS服务器,完成ip地址和域名之间的映射
域名 ip地址
浏览器显示完整网页的过程:
在浏览器地址栏中输入http://www.baidu.com,
浏览器会发送一个Request请求去获取http://www.baidu.com的HTML页面
服务器会把包含该页面的response对象返回给浏览器
浏览器分析页面中的内容发现其中引用了很多文件,包括image js文件等,所以浏览器会再次发送Request去获取这些图片 js文件、
当所有的文件下载完成,浏览器根据html的语法结构,将网页完整的显示出来
1、爬虫分为几步
(1)拼接一下url地址
word=input('请输入要搜索的关键字:')
params=parse.urlencode({'wd':wored})#wd=%%%%%%
url='http://www.baidu.com/s?'.format(params)
header={'User-Agent':'mozi........'}
(2)发送请求获取响应
一、包装请求 二、发送请求 三、获取响应
req=request.Request(url=url,headers=header)
res=request.urlopen(req)
html=res.read().decode('')
(3)保存到本地
一、起名字 filename=word+'.html'
二、执行保存操作
with open(filename,'w') as f:
f.write(html)
1、用户输入—爬取谁的吧
2、转码(urlencode)
3、拼接头部 拼接url地址
4、发送请求 获取响应
5、让用户选择,他想爬取多少页到多少页 就可以爬取(用户输入)
6、找规律,页数page和url地址之间的规律pn=(page-1)*50
7、让page进入for循环
8、结构:类形式(init函数:放一些初始化的函数;get_html发送请求获取响应;
parse_html解析页面提取想要的标题;save_html保存用的,run函数来控制)
程序入口,main
class BaiduTiebaspiader:
def __init__(self):#放一些初始化的函数
pass
def get_html(self):#发送请求获取响应
pass
def parse_html(self):#解析页面提取想要的标题
pass
def save_html(self):#保存用的
pass
def run(self):#控制
pass
if __name__=='__main__':#是否是系统变量,是模块的标识符
spider=BaiduTiebaspiader()
spider.run()
#任意选取符合规定的网站,要求用户输入+爬取(需要涉及转码 拼接url地址 拼接头部)
https://www.baidu.com/s?wd=%E5%88%98%E4%BA%A6%E8%8F%B2
#beautifulsoup和xpath很多一样,设计的目的解析xml html
#字符串——正则 html xml——xpath beautifulsoup json——jsopath
#直接拿过来就可以用
#一、完成buautifulsoup4安装
# 两种方法 安装buautifulsoup4:
# 命令方式 安装: pip3 install beautifulsoup4
# pycharm环境形式 安装:file settings project + beautifulsoup4 安装 ok
#二、导入buautifulsoup类
# from bs4 import BeautifulSoup
#三、传入初始化参数
# soup=BeautifulSoup('html_doc','lxml')
# html_doc被解析的对象 lxml解析器进行解析
#xpath lxml库 解析器
#beautifulsoup lxml库 解析器;python标准库;html5lib解析器
#四、实例
# from bs4 import BeautifulSoup
# markup='<a href="http://example.com" rel="external nonfollow" rel="external nonfollow" rel="external nonfollow">l ike to <i>example.com</i></a>'
# soup=BeautifulSoup(markup,'lxml')
# # print(soup)
# # print(soup.prettify())
# print(soup.find_all('i'))
# print(soup.find_all('i','a'))
# print(soup.find_all(['i','a']))
# print(soup.find_all(rel="external nonfollow"))
#json模块——键值对
#jsonpath寻址——多层嵌套字典 直接进行数据提取
# data={'key1':{'key2':{'key3':{'key4':{'key5':{'key6':'python'}}}}}}
# print(data['key1']['key2']['key3']['key4']['key5']['key6'])
#
# import jsonpath
# print(jsonpath.jsonpath(data,'$.key1.key2.key3.key4.key5.key6'))
# print(jsonpath.jsonpath(data,'$..key6'))
#json模块去字符串 加字符串
# import json
# json.dump()
# json.loads()
# 序列化:python转成字符串 (操作完 执行保存操作前 序列化) json.dump() json.dumps()
# 反序列化:把字符串转成python(寻址之前 对字符串 进行去字符串的操作) json.loads() json.load()
#json.loads的用法
# import json
# str_list='[1,2,3,4]'
# str_dict='{"city":"北京","name":"小明"}'
# print(type(str_list))
# print(type(str_dict))
# print(type(json.loads(str_list)))
# print(type(json.loads(str_dict)))
#json.dump的用法
# import json
# app_list=[
# {"name":"腾讯qq","link":"http://www.qq.com"},
# {"name":"新浪微博","link":"http://www.xinlang.com"},
# {"name":"吃鸡","link":"http://www.***.com"}
# ]
# with open('app.json','w',encoding='utf-8') as f:
# json.dump(app_list,f,ensure_ascii=False)
0、介绍课本目录,了解前四周基础知识重要性
明确熟练掌握的知识:爬虫 解析 框架
1、明确任务汇率
安装flask框架 创建汇率文件 创建服务器网站
回顾前4周爬虫知识
书写客户端爬虫代码
2、Get和Post方法
Get 和Post方法在客户端程序写法的区别(重要)
明确GET POST方法的区别:url地址的拼接,安全性;
Get和Post方法在服务器端获取数据的方式完全一致;
Get 和Post方法在路由选择中,默认选择的为get 指定post方式如何指定,两种均可如何指定;
利用Get 和Post方法实现多个参数的设置利用&进行拼接。
3、正则表达式(课本p14页)
#beautifulsoup和xpath很多一样,设计的目的解析xml html
#字符串——正则 html xml——xpath beautifulsoup json——jsopath
#直接拿过来就可以用
#一、完成buautifulsoup4安装
# 两种方法 安装buautifulsoup4:
# 命令方式 安装: pip3 install beautifulsoup4
# pycharm环境形式 安装:file settings project + beautifulsoup4 安装 ok
#二、导入buautifulsoup类
# from bs4 import BeautifulSoup
#三、传入初始化参数
# soup=BeautifulSoup('html_doc','lxml')
# html_doc被解析的对象 lxml解析器进行解析
#xpath lxml库 解析器
#beautifulsoup lxml库 解析器;python标准库;html5lib解析器
#四、实例
# from bs4 import BeautifulSoup
# markup='<a href="http://example.com" rel="external nonfollow" rel="external nonfollow" rel="external nonfollow">l ike to <i>example.com</i></a>'
# soup=BeautifulSoup(markup,'lxml')
# # print(soup)
# # print(soup.prettify())
# print(soup.find_all('i'))
# print(soup.find_all('i','a'))
# print(soup.find_all(['i','a']))
# print(soup.find_all(rel="external nonfollow"))
#json模块——键值对
#jsonpath寻址——多层嵌套字典 直接进行数据提取
# data={'key1':{'key2':{'key3':{'key4':{'key5':{'key6':'python'}}}}}}
# print(data['key1']['key2']['key3']['key4']['key5']['key6'])
#
# import jsonpath
# print(jsonpath.jsonpath(data,'$.key1.key2.key3.key4.key5.key6'))
# print(jsonpath.jsonpath(data,'$..key6'))
#json模块去字符串 加字符串
# import json
# json.dump()
# json.loads()
# 序列化:python转成字符串 (操作完 执行保存操作前 序列化) json.dump() json.dumps()
# 反序列化:把字符串转成python(寻址之前 对字符串 进行去字符串的操作) json.loads() json.load()
#json.loads的用法
# import json
# str_list='[1,2,3,4]'
# str_dict='{"city":"北京","name":"小明"}'
# print(type(str_list))
# print(type(str_dict))
# print(type(json.loads(str_list)))
# print(type(json.loads(str_dict)))
#json.dump的用法
# import json
# app_list=[
# {"name":"腾讯qq","link":"http://www.qq.com"},
# {"name":"新浪微博","link":"http://www.xinlang.com"},
# {"name":"吃鸡","link":"http://www.***.com"}
# ]
# with open('app.json','w',encoding='utf-8') as f:
# json.dump(app_list,f,ensure_ascii=False)
爬虫
Urllib库 .request()模块 .urlopen()
Import urllib.request
Res=Urllib.request.urlopen(url地址)
Res.read().decode()
2. 强化版
Urllib库 .request()模块 .parse()模块
.Request() .urlopen()
.urlencode() .parse()
Import urllib.request
Name=Input(“提示用户输入关键词”)
kw=urllib.parse.urlencode(Name)/parse(Name)
Url=’www.baidu.com...’+kw
New_url=Urllib.request.Request(url=url,headers=headers)
res=Urllib.request.urlopen(new_url)
res.read().decode()
3.最终强化
百度贴吧(当前页的爬取:用户的输入 头部信息的拼接 爬取)
Init get_data() parse_data() save_data() run()
import urllib.request from urllib import request,parse from lxml import etree class Tieba(object): def __init__(self, name): self.url = 'https://tieba.baidu.com/f?kw=%E7%94%B5%E5%BD%B1%E7%A5%A8%E6%88%BF' self.headers = {'user-agent': 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'} def get_data(self,url): req=urllib.request.Request(url=url,headers=self.headers) res=urllib.request.urlopen(req) response=res.read().decode() return response def parse_data(self,data): pass def save_data(self,data_list): for data in data_list: print(data) def run(self): pass if __name__=='__main__': tieba=Tieba('') tieba.run()
对爬虫爬取的东西进行解析
针对不同的网页数据结构有不同的数据解析办法
Import re
Re.find(“chn”)
2.xpath——HTML XML(“<html><body><a><b><c><d>”)
lxml库 etree模版
Element 类一一字符串 (
Element0)去节点的字符串 “root”.tostring(成结构 只有左边 没有右边<htm>自动补上:set
Aroot> :
tag
text
)
Elementtree.类一一字符串(
.fromstring()
.XML) 把字符串外衣去掉 转换为 XML
.HTML() 把字符串外衣去掉 转换为 HTML
)
Elementpath 类一一寻址(
.xpath(xpath寻址规则
Xpath_寻址规则:
/ // @ [==] xpathhelper 工具
去掉字符串:.fromstring .XML .HTML
寻址:.xpath(xpath寻址规则/ // @ )
百度贴吧(
代码:
import urllib.request from urllib import request,parse from lxml import etree class Tieba(object): def __init__(self, name): self.url = 'https://tieba.baidu.com/f?kw=%E7%94%B5%E5%BD%B1%E7%A5%A8%E6%88%BF' self.headers = {'user-agent': 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'} def get_data(self,url): req=urllib.request.Request(url=url,headers=self.headers) res=urllib.request.urlopen(req) response=res.read().decode() return response def parse_data(self,data): html=etree.HTML(data) el_list=html.xpath('//*[@id="thread_list"]/li[3]/div/div[2]/div[1]/div[1]/a') print(el_list) data_list=[] for el in el_list: temp = {} temp['title'] = el.xpath('./text()')[0] temp['link'] = 'https://tieba.baidu.com/' + el.xpath('./@href')[0] data_list.append(temp) try: next_url='https:'+html.xpath('//a[contains(text(),"下一页")]/@href')[0] except: next_url=None return data_list,next_url def save_data(self,data_list): for data in data_list: print(data) def run(self): next_url=self.url while True: data=self.get_data(next_url) data_list,next_url=self.parse_data(data) self.save_data(data_list) print(next_url) if next_url==None: break if __name__=='__main__': tieba=Tieba('') tieba.run()
一、当前页的爬取
urllib request urlopen
Request
Parse urlencode、quote
.read() .
二、
当前页的解析—当前页的标题和标题对应的url地址
当前页的解析—下一页的url地址
三、
当前页的标题和标题对应的url地址——保存
下一页的url地址——继续爬取
四、程序终止条件:没有下一页url地址 try except)
3、beautifulsoup——HTML XML(“<html><body><a><b><c><d>”)
安装bs4 导入类from bs4 import Beautifulsoup
初始化Beautifulsoup(被寻址的对象,’lxml’) find寻址
4、json与jsonpath——json(“{body:{a:{b:{c:}}}}”)
导入json模块 调用json.loads()去掉字符串外衣
Jsonpath.jsonpath(被寻址的对象,“$..寻址规则”)
window+R:
从爬虫出:
从管道出:
取消pipelines的注释:
文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr
文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc
文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8
文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束
文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求
文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname
文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立
文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码
文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词
文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限
文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定
文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland