第一、二周
爬虫概念:按照一定规则,自动请求万维网,并获取网页内容
爬虫法律规范: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页)
11.6号
#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)
11.13
爬虫
- 最基础的爬虫
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()
对爬虫爬取的东西进行解析
针对不同的网页数据结构有不同的数据解析办法
- 正则表达式——字符串解析(“hsdfhasijchniasfjc”)
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(被寻址的对象,“$..寻址规则”)
11.20框架构建
window+R:
从爬虫出:
从管道出:
取消pipelines的注释:
安装scrapy框架
1、创建项目 scrapy startproject 项目名字
2、cd到项目下边
创建爬虫 scrapy genspider 爬虫名字 爬虫域名
3、修改settings当中ROBOTSTXT_OBEY=****
4、修改爬虫文件中的parse()模块,完成数据的解析提取
item={}
item['title']=response.xpath('xpath的语法规则')
print(item)#这个print'语句用来测试是否到了第六步,不具有最终的功能
5、程序运行:scrapy crawl 爬虫名字
6、在爬虫文件中输入yield item 把item中的内容yield回管道
7、在管道文件pipelines.py 中,增加print()语句来验证是否数据 真正的放到管道中
8、程序并没有结果输出,所以需要修改settings文件 把item_pipeline释放注释,让其真正有效
9、结果输出没结构,LOG_LEVEL='WARNING'设置输出内容为警告及以上