python安装之后检查发现不存在可能是路径path问题
python不区分""和''但是必须成对出现
◆什么是爬虫
网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。由于互联网
数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析已成为如今主流
的爬取策略。
◆爬虫可以做什么
你可以爬取妹子的图片,爬取自己想看的视频等等,只要你能通过浏览器访问的数据
都可以通过爬虫获取。
◆爬虫的本质是什么
模拟浏览器打开网页,获取网页中我们想要的那部分数据。
◆爬虫基本流程
◆准备工作
通过浏览器查看分析目标网页url变换特点
◆获取数据
通过HTTP库向目标站点发起请求,请求可以包含额外的 HTTP, header,等信息,如
果服务器能正常响应,会得到一个 Response,便是所要获取的页面内容。
◆解析内容
得到的内容可能是HTML、json等格式,可以用页面解析库、正则表达式等
进行解析。
◆保存数据
保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的
文件。
爬虫是前半部分,搜索引擎就是加了索引后面。
通过逐级缩小读取查找文字所在位置(要知道是如何找到文字位置)html->body->wrapper->
URL
URL 专业一些的叫法是统一资源定位符(Uniform Resource Locator),它的一般格式如下(带方括号[]的为可选项):
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
URL 的格式主要由前个三部分组成:
- protocol:第一部分就是协议,例如百度使用的就是https协议;
- hostname[:port]:第二部分就是主机名(还有端口号为可选参数),一般网站默认的端口号为80,例如百度的主机名就是www.baidu.com,这个就是服务器的地址;
- path:第三部分就是主机资源的具体地址,如目录和文件名等。
爬虫需要的第三方库
- bs4就是beautifulsoup4
- import re
- urllib 库是 Python 内置的,无需我们额外安装,只要安装了 Python 就可以使用这个库。 import urllib .request,urllib .error
- import requests 库是第三方库,需要我们自己安装。
- import xlwt #进行excel操作
- import sqlite3
request库基础语法
1.基础函数
encoding = 'utf-8'
使用utf-8可以正常显示中文、日文、韩文、阿拉伯文
可以直接使用r.encoding=r.apparent_encoding代替r.encoding = 'utf-8'
r是网址内容存储的位置
设置编码格式,encoding是编码的意思,在python中,Unicode类型是作为编码的基础类型。
response = requests.get('http://www.baidu.com')
print(response.status_code) # 打印状态码
print(response.url) # 打印请求url
print(response.headers) # 打印头信息
print(response.cookies) # 打印cookie信息
print(response.text) #以文本形式打印网页源码
print(response.content) #以字节流形式打印
2.返回对象
text返回的是Unicode型的数据 ,content返回的是是二进制的数据。 也就是说,如果你想取文本,可以通过r.text。 如果想取图片,文件,则可以通过r.content
r.status_code HTTP请求的返回状态,200表示连接成功,404表示失败
r.text HTTP响应内容的字符串形式,即url对应的页面内容
r.encoding 从HTTP header中猜测的响应内容编码方式
r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)
r.content HTTP响应内容的二进制形式
r.raise_for_status 如果网连接出现错误,那么它就会用try-except来获取一个异常
r.apparent_encoding比r.encoding更为准确
3.错误汇总
python requests SSL证书问题
- 方法一:加上一个参数:verify=证书路径,或verify=False
例:url = 'https://inv-veri.chinatax.gov.cn/'
req = requests.get(url,verify=False)
- 方法二:直接上一段添加证书代码
ssl._create_default_https_context = ssl._create_unverified_context#注意用了这个就不能用requests了,得用urllib2.Request
异步爬取
速度更快
html两种读取方法
方法一:
url = "http://www.douyu.com/Jack_Cui.html"
req = request.Request(url)
responese = request.urlopen(req)
html = responese.read().decode()
Print(“html ”)
decode是转换返回数据的bytes格式为str
方法二:
url = "http://www.douyu.com/Jack_Cui.html"
req = requests.get(url=url)
req.encoding = req.apparent_encoding
Print(rep.text)
BeautifulSoup4模块
1.beautifulsoup4主要解析器
用的比较多的是 lxml 解析器
使用例子:
soup = BeautifulSoup(html,"html.parser")
print(soup.title.string ) 获取标题的内容
print(soup.p.string ) 获取 p标签里面的内容
print(soup.title.parent.name) 获取 title的父级标签
print(soup.get_text()) 获取网页中所有的内容
print (soup.a) 获取所有的a标签中的所有内容(<a> 标签用于指定超链接)
2.beautifulsoup4返回的对象
BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,
所有对象可以归纳为4种:
- Tag
- NavigableString
- BeautifulSoup
- Comment
Tag:
- 利用 soup加标签名轻松地获取这些标签的内容
- 它查找的是在所有内容中的第一个符合要求的标签
- 这些对象的类型是
<class 'bs4.element.Tag'>
- Tag对象的两个重要属性:
name :输出标签的标签类型名
attrs :以字典的形式获取标签的属性,也可以修改和删除
NavigableString
- 作用:获取标签内部的文字
- 直译:可遍历的字符串
- 使用方法:
soup.p.string
- 对象类型:
<class 'bs4.element.NavigableString'>
BeautifulSoup
- 文档对象,也就是整个文档的内容。
- 可以当做是一个Tag对象。
Comment
- Coment对象是一个特殊类型的NavigableString对象。
- 如果标签内部的内容是注释,例如:
<!-- Elsie -->
。那么该NavigableSring对象会转换成Comment对象,并且会把注释符号去掉。 - 如果我们需要获得Coment类型的对象,需要先判断对象类型是Coment还是NavigableString。
re正则表达式
1.引入模块
import re
2.正则表达式的常用操作符
例:pattern = "1[35678]\d{9}"
规则:1.都是数字 2.长度为11 3.第一位是1 4.第二位是35678中的一位
3.re库主要功能函数
re.compile( ):根据包含的正则表达式的字符串创建模式对象
注:在进行search,match等操作前不适用compile函数,会导致重复使用模式时,需要对模式进行重复的转换。降低匹配速度。而此种方法的调用方式,更为直观。
- re.match(pattern, str)例子:
result = re.match(pattern, str) #pattern为要校验的规则,str为要进行校验的字符串,从左到右进行匹配
result.group() #如果result不为None,则group方法则对result进行数据提取
- re.compile(pattern[, flags])例子:
pattern = re.compile(r'<a href="(.*?)">')
- re.search(pattern, str)例子:
- re.findall(pattern, str)例子:
- re.split(pattern, str)例子:
4.re返回的对象
RegexObject 对象由re.compile() 返回
Match对象由match(),search(),findall()返回
- Match对象
xlwt模块
1.设置文本样式
import xlwt
# 使用Workbook创建一个表格
wbk = xlwt.Workbook()
# add_sheet添加工作表
sheet = wbk.add_sheet("sheet")
# 设置样式,初始化样式
style = xlwt.XFStyle()
#设置字体
font = xlwt.Font()
font.name = u"微软雅黑"
font.colour_index = 4
font.bold = True
style.font = font
# 对工作表进行操作 第一个数字代表行 从0开始 第二个数字代表列 从0开始
sheet.write(0,1,'hello',style)
sheet.write(1,1,"python")
# 保存文件,默认为程序同级目录
wbk.save("test.xls")
2.设置表格样式
import xlwt
header = [u"列表1",u"列表2"]
xls = xlwt.Workbook()
sheet = xls.add_sheet("sheet")
# 设置列宽
sheet.col(0).width = (5000)
sheet.col(1).width = (30*500)
# 设置行高
tall_style = xlwt.easyxf('font:height 720;')
sheet.row(0).set_style(tall_style)
i = 0
for each_header in header:
sheet.write(0,i,each_header)
i += 1
xls.save("test.xls")
sqlite3模块
对比mysql数据库的使用
1.Python SQLITE数据库导入模块:
import sqlite3
2.创建数据库/打开数据库:
cx = sqlite3.connect("E:/test.db") 其实我们不需要显式的创建一个sqlite数据库,在调用connect函数的时候,指定库名称,如果指定的数据库存在就直接打开这个数据库,如果不存在就新创建一个再打开。这一点应用很好理解。
3.数据库连接对象:
打开数据库时返回的对象cx就是一个数据库连接对象,它可以有以下操作:
commit()--事务提交 rollback()--事务回滚 close()--关闭一个数据库连接 cursor()--创建一个游标
4.Python SQLITE数据库游标的使用:
首先,定义一个游标:
cu = cx.cursor() 这样定义了一个游标。游标对象有以下的操作:
execute()--执行sql语句 executemany--执行多条sql语句 close()--关闭游标 fetchone()--从结果中取一条记录,并将游标指向下一条记录 fetchmany()--从结果中取多条记录 fetchall()--从结果中取出所有记录 scroll()--游标滚动 下面就使用Python SQLITE数据库中游标对我们上面建立的数据库作一些操作吧:
1,建表:
cu.execute('create table catalog (id integer primary key,pid integer,name varchar(10) UNIQUE)') 上面语句创建了一个叫catalog的表,它有一个主键id,一个pid,和一个name,name是不可以重复的。
2,插入数据:
cu.execute("insert into catalog values(0, 0, 'name1')") cu.execute("insert into catalog values(1, 0, 'hello')") 简单的插入两行数据,不过需要提醒的是,只有提交了之后,才能生效.我们使用数据库连接对象cx来进行提交commit和回滚rollback操作.
cx.commit()
3,查询:
cu.execute("select * from catalog") 要提取查询到的数据,使用游标的fetch***函数,如:
print cu.fetchall() 返回结果如下:
[(0, 0, u'name1'), (1, 0, u'hello')] 如果我们使用cu.fetchone(),则首先返回列表中的第一项,再次使用,则返回第二项,依次下去.
4,修改:
cu.execute("update catalog set name='name2' where id = 0")
cx.commit() 注意,修改数据以后提交
5,删除:
cu.execute("delete from catalog where id = 1") cx.commit() 以上简单的操作反应的Python SQLITE数据库操作的基本要点,这里点到为止.然后,SQLite的强大,并不仅限于此,其对SQL高级特性的支持及其小巧灵活的特点,使得SQLite在众多领域受到开发者的青睐.