第三章简单静态网页爬取
第三章简单静态网页爬取
实现HTTP请求
Http请求过程
生成请求->(请求头处理,超时设置,请求重试)->查看状态码等
urllib3
urllib3网址
https://pypi.org/project/urllib3/
重要特性:8个
线程安全
*管理连接池
客户端SSL/TLS验证
使用分部编码上传文件
协助处理重复请求的HTTP重定位
支持压缩编码
支持HTTP和 SOCKS代理
测试覆盖率达到100%
生成请求
urllib3.request(method,url,fields,headersurlopen_kw)
method:请求类型,如GET,HEAD,DELETE等,必填
url:网址,必填
fields:请求参数,默认None
headers:请求头参数,默认None
timeout:超时时间(秒)
如: timeout=3.0
如:urllib3.Timeout(connect=1.0,read=3.0)
retries:请求重试(次)
如:retries=10
如:retries=5,redirect=4
如:retries=5
如:redirect=False
urllib3请求实例
SY_3_5_URLLIB_HTTP.py
requests
requests网址
http://www.python-requests.org/en/master/
特性:15个
Keep-Alive&连接池
基本/摘要式的身份认证
文件分块上传
国际化域名和URL
优雅的 key/value Cookie
流下载
带持久Cookie的会话
自动解压
连接超时
浏览器式的SSL认证
Unicode响应体
分块请求
自动内容解码
HTTP(S)代理支持
支持.netrc
生成请求
requests常用方法
requests.get
rqg=requests.get(url)
rqg.status_code:返回状态码
rqg.encoding:查看编码
rqg.headers:查看响应头
rqg.text:查看网页内容
chardet.detect(rqg.content)['encoding']编码更准
rqg=requests.get(url,headers,timeout)
timeout:超时(秒)
headers:请求头
requests.head
requests.post
requests.request
method
url
params
data
json
headers
cookies
auth
timeout
proxies
allow_redirects
stream
verify
cert
requests请求实例
SY_3_11_REQUESTS_GET.py
解析网页
Chrome开发者
开发者工具
多种方式打开(F12,Ctrl+Shift+I等)
工具面板9个
*元素面板
*控制台面板
*源代码面板
*网络面板
性能面板
内存面板
应用面板
安全面板
审查面板
常用面板
元素面板
HTML,CSS.DOM
可以查看元素在页面对应的位置
控制台面板
可以查看警告或错误
可以JS交互
源代码面板
可以进行JS调试
可以查看HTML源码
网络面板*
查看资源,HTTP请求头,响应内容,Cookies,Timing
正则表达式
正则表达式
学习站点
https://www.runoob.com/regexp/regexp-syntax.html
https://www.runoob.com/python/python-reg-expressions.html
常用表达式
.*?
re模块
使用步骤
先将正则表达式的字符串形式编译为Pattern实例
然后使用Pattern实例处理文本并获得匹配结果(一个Match实例)
最后使用Match实例获得信息,进行其他的操作
常用方法compile,match,search,split,findall,finditer,sub
re.compile(pattern,flags=0)
flag参数可选值
re.M多行模式
rs.S将'.'置为匹配任意字符,常见.*?
rs.I忽略大小写
re.search(pattern,string,flags=0)
re.findall(pattern,string,flags=0)
re获取网页标题实例
SY_3_14_RE_TITLE.py
Xpath解析网页
基本语法
构造对象:
html=lxml.etree.HTML(text,parser,*,base_url)
text:需要转换为HTML的字符串
paser:HTML解析器
如:etree.HTMLParser(encoding='utf-8')
base_url:原始URL
Xpath匹配内容
常用表达式
nodename:选取nodename节点的所有子节点
/:从当前节点选取直接子节点
//:从当前节点选取所有子孙节点
.:选取当前节点
..:选取当前节点的父节点
@:选取属性
如: result=html.xpath('head')
谓语
谓语用来查找 某个特定的节点或包含某个指定的值 的节点
谓语被嵌在路径后的方括号中
谓语常用表达式
/html/body/div[1]:选取body子节点的第一个div节点
/html/body/div[last()]:选取 body子节点的最后一个 div节点
/html/body/div[last()-1]:选取 body子节点的倒数第二个div节点
/html/body/div[position()<3]:选取属于body子节点的前两个div节点
/html/body/div[@id]:选取属于 body子节点的带有id属性的div节点
/html/body/div[@id="content"]:选取属于body子节点的id属性值为content的div节点
/html/body/div[xx>10.00]:选取属于body子节点的xx元素值大于10的节点
如:result=html.xpath('//header[@class]')
功能函数
模糊搜索功能,只需部分特征就可搜索
常用的功能函数
starts-with
//div[starts-with(@id,"co")]
contains
//div[contains(@id,"co")]
and
//div[contains(@id,"co") and contains(@id,"en")]
text
//li[contains(text(),"first")]
如:title=html.xpath('//title/text()')
xpath提取header节点下全部标题文本及对应链接实例
SY_3_20_LXML_XPATH_4.py
Beautiful Soup解析网页
解析器
html.parset
lxml
lxml-xml或xml
html5lib
默认
创建对象
BeautifulSoup("..."):通过字符串创建
BeautifulSoup(open("index.html")):通过HTML文件创建
BeautifulSoup(html,'lxml):指定lxml解析器创建BS4对象
格式化输出
BeautifulSoup.prettify(self, encoding=None, formatter='minimal')
对象类型
Tag
soup.head
soup.body.a
soup.find_all('a')
tag属性
tag.name:获取tag的name
tag.attrs:获取tag对象的全部属性
tag['class']:获取tab的class属性
NavigableString
soup.title.string:获取tag对象中包含的字符串
BeautifulSoup
type(soup)
Comment
是文档的注释
使用soup.tag.string获得
是个可以直接输出 的字符串
搜索节点
rlt=find_all(name,attrs,recursive,string,**kwargs)
name:名为name的tag对象
attrs:css类名的tag对象
recursive:是否检索所有子孙节点,默认true
string:匹配字符串的内容
搜索子节点
rlt2 = rlt.find_all("a")
for i in rlt2: print i.string
选择子节点
select
#通过tag标签逐层查找 soup.select("html head title")
#寻找直接子标签 soup.select("head > title")
#选择所有紧接着id为link1元素之后的class为sister的元素 soup.select("#link1 + .sister")
#选择p元素之后的每一个ul元素 soup.select("p + ul")
#同时用多种CSS选择器查询元素 soup.select("#link1,#link2")
#通过查询元素属性 soup.select('a[href="http://example.com/elsie"]')
#通过语言查找 soup.select('p[lang|=en]')
select_one
#查找第一个元素 soup.select_one(".sister")
查找父节点
find_parent()
#查找a的父节点中的P标签 a_string.find_parent("p")
查兄弟节点
find_next_sibling()
BS4搜索目标并提取文本内容实例
SY_3_28_BS4_PRETTIFY_8.py
存储数据
存为JSON文件
编码与解码
编码过程为将Python对象转换为Json对象的过程
Python对象
html.xpath
Json对象
{key:value,key2:value2}
解码过程为将 Json对象转换为Python对象的过程
json.dump:将JSON对象写入文件内
json.load()用于从json文件中读取数据
json.dumps:生成一个字符串
json.loads(str):str类型的数据转成dict
dump&dumps参数
skipkeys:是否跳过非python基本类型的key
ensure_ascii:非 ASCII字符显示成\uXXX格式,设为False正常显示
indent:是否缩进格式化,若值>=0,则按该值缩排,否则若为None,则一行显示,默认None
separators:分隔符,{key:value,key2:value2}(',',':')
encoding:编码,默认utf-8
sort_keys:根据keys的值 进行排序
dump导出Json文件实例
SY_3_29_JSON_FILE.py
存储到MySQL
创建test库
1,打开mysql workbench客户端
2,左侧树图空白处->右击->创建schema
3,输入schema名称,选择字符集utf8,utf8_bin ->apply应用
4,如何修改schema和表字符集,如视频
修改schema和表字符集视频
连接方法
pymysql.connect(host,port,user,passwd,db,charset,connect_timeout,use_unicode)
host,port:主机和端口(3306)
本地
localhost
127.0.0.1
它机
home.hddly.cn
192.168.31.11
user,passwd:用户和密码
db:数据库名
charset:编码,建议utf8
connect_timeout:连接超时,默认10秒
use_unicode:以unicode格式返回,默认None
连接对象connect
commit:提交事务
rollback:事务回滚
cursor:创建游标
close:关闭游标
execute:执行sql,可以增加、删除、修改记录
executemany:执行多条sql
fetchone:获取一条记录
fetchall:获取全部记录
scroll:游标滚动
存储到MySQL实例
SY_3_31_PYMYSQL.py
常见问题
1,入库时脚本运行提示错误:Incorrect String value...
错误信处如图
更改数据库和表的字符集为utf8,如视频
修改schema和表字符集视频
实训内容
实训一
实训要求
熟练使用urllib3库
urllib3请求实例
SY_3_5_URLLIB_HTTP.py
熟练使用 requests库
requests请求实例
SY_3_11_REQUESTS_GET.py
taobao商品采集:SY_4_3_TAOBAO.py,超星随堂
实训二
实训要求
熟练使用Chrome开发者工具
取元素的Xpath路径和选择器路径
取Cookies
熟练使用正则表达式
re获取网页标题实例
SY_3_14_RE_TITLE.py
熟练使用Xpath
xpath提取header节点下全部标题文本及对应链接实例
SY_3_20_LXML_XPATH_4.py
熟练使用BeautifulSoup
BS4搜索目标并提取文本内容实例
SY_3_28_BS4_PRETTIFY_8.py
实训三
实训要求
熟练使用JSON库
dump导出Json文件实例
SY_3_29_JSON_FILE.py
熟练使用PyMySQL库
存储到MySQL实例
SY_3_31_PYMYSQL.py