1. request()库
request.get(url, params=None, **kwargs)
url:网页链接
kwargs:访问控制参数
r = request.get(url)
:两个对象:response和request对象
requests的主要方法:
get() head() post() put() patch() delete()
response对象的属性:
response对象返回网页所有内容。
r.status_code:http请求的返回状态:200表示连接成功,其他表示失败(才可以调用属性)
r.txt:http响应内容的字符串表示,即:url对应的页面内容
r.encoding:从http header中猜测的响应内容编码方式
r.apparnet_encoding:从内容中分析出的响应内容编码方式
r.content :http响应内容的二进制形式
import requests
r = requests.get("http://www.baidu.com")
print(r.status_code) #检测状态请求的状态码:200正确,
type(r)#返回对象类型
r.headers #返会请求页面的对象信息
#异常处理
import requests
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparnet_encoding
return r.text
except:
return "产生异常"
if __name__ == "__main__":
url = "http://www.baidu.com"
print(getHTMLText(url))
#实例:访问京东商品:
import requests
url = "https://item.jd.com/2967929.html"
try:
r = requests.get(url)
r.raise_for_statusin
r.encoding = r.apparent_encoding
except:
print("爬取失败")
print("right")
#访问亚马逊商品页面:
import requests
url = "http://www.amazon.cn/gp/product/B01m8l5z3y"
try:
kv = {'user-agent':'Mozilla/5.0'}
r = requests.get(url, headers=kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[1000:2000])
except:
print("爬取失败")
#百度与360搜索关键词提交:向这两个搜索引擎自动提交并获取结果
import requests
kv = {'wd':'Python'}#360关键词接口是:{'q':'#keyword#'}
r = requests.get("http://www.baidu.com/s", params = kv)#r这里代表response对象
r.status_code
print(r.request.url)# response对象只有request 属性,而不是requests
print(r.text)
print(len(r.text))
#网络图片的爬取和存储
import requests
import os
url = "https://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg"
root = "C://Users//奋斗//Pictures//"
path = root+url.split('/')[-1]
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r = requests.get(url)
with open(path, 'wb') as f:
f.write(r.content)
f.close()
print("文件保存成功")
else:
print("文件已存在")
except:
print("爬取失败")
2. BeautifulSoup库:解析、遍历、维护“标签树”的功能集合库![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fbd09896b80c9622c371afb3b1455de4.png#pic_center)
BeautifulSoup类的基本元素:
Tag
Name
Attributes
NavigableString
Comment
#使用BeautifulSoup:UTF-8编码
import requests
r = requests.get("http://python123.io/ws/demo.html")
demo = r.text
from bs4 import BeautifulSoup #引用方式 从bs4引用BS类
soup = BeautifulSoup(demo, "html.parser") #做一锅汤:BS类对应一个HTML/XML文档的全部内容,soup变量就代表了我们解析后的页面
print(soup.prettify())#网页源代码
print(soup.title)
tag = soup.a
print(tag)
#标签:下行遍历
print(soup.head.contents)
print(soup.body.contents)
print(soup.body.contents)
print(soup.body.contents[1]) #[0]为空
for child in soup.body.children:
print(child)#遍历儿子节点
for child in soup.body.descendants:
print(child)#遍历子孙节点
#标签遍历:上行遍历
soup.html.parent#就是他自己
soup.parent#None
#标签遍历:平行遍历:条件:所有的平行遍历必须发生在同一个父节点下的各节点间
print(soup.a.next_sibling)
print(soup.a.next_sibling.next_sibling)
i = 0
for sibling in soup.a.next_siblings:
print(i)
i+=1
print(sibling)
print("\n\n\n")
for sibling in soup.a.previous_siblings:
print(i)
i+=1
print(sibling)
print(soup.prettify())#使网页页面层次清晰,增强可读性
信息标记
#三种信息标记的形式:HTML, JSON, YAML
#信息提取的一般方法
#1. 完整解析信息的标记形式,再提取
#2.无视标记形式,直接去提取关键信息
#3.融合方法:需要标记解析器及文本查找函数
#提取HTML中所有URL链接:
from bs4 import BeautifulSoup
import requests
r = requests.get("http://python123.io/ws/demo.html")
demo = r.text
soup = BeautifulSoup(demo, "html.parser")
for link in soup.find_all('a'):
print(link.get('href'))#挑选出链接信息进行打印
print(soup.find_all(['a', 'b']))
for tag in soup.find_all(True):#打印出所有标签
print(tag.name)
import re#引入正则表达式库
for tag in soup.find_all(re.compile('b')):#打印出b为首的标签(此正则表达式库函数表示返回以b开头的所有信息)
print(tag.name)
#查找p标签中包含course字符串的标签
soup.find_all('p', 'course')
for tag in soup.find_all('p', 'course'):
print(tag)
#查找id的信息
print(soup.find_all(id='link1'))
print(soup.find_all(id = 'link'))
for tag in soup.find_all(id = re.compile('link')):
print(tag)
from bs4 import BeautifulSoup
import requests
r = requests.get("http://python123.io/ws/demo.html")
demo = r.text
soup = BeautifulSoup(demo, "html.parser")
import re
for tag in soup.find_all('a', recursive=True):#是否对子孙全部检索
print(tag)
#查找页面所有字符串中有目标字符串的信息
for ss in soup.find_all(string = "Basic Python"):
print(ss)
#若我们只知道Python字符,用正则表达式
for ss in soup.find_all(string = re.compile("Basic Python")):
print(ss)
for ss in soup.find_all(string = re.compile("link1")):#文本中没有
print(ss)
实例一:中国大学排名定向爬虫
#coding=gbk
#定向爬虫:从网络连接信息;提取信息;打印信息
#采用requests库-bs4库路线实现爬虫
#对输出排版进行优化
import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(url):
try:
r = requests.get(url, timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return""
return ""
def fillUnivList(ulist, html):
soup = BeautifulSoup(html, "html.parser") #html的解析性
#观察信息后选择查找:
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag): #判断tr是否是Tag
tds = tr('td')
#将需要的信息添加到列表中
ulist.append([tds[0].string, tds[1].string, tds[2].string])
def printUnivList(ulist, num):
#格式化输出
#print("{:^10}\t{:^6}\t{:^10}".format("排名", "学校", "分数"))
#for i in range(num):
#u = ulist[i]
#print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))
#采用中文字符的空格填充chr(12288)
#中英文输出对齐排版问题
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format("排名", "学校", "分数", chr(12288)))#增加中文空格的变量位置
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2], chr(12288)))
def main():
unifo = []
url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html'
html = getHTMLText(url)
fillUnivList(unifo, html)
printUnivList(unifo, 20)
main()
正则表达式 RE库
#正则表达式:
# 简洁:一行胜千言regular expression RE
#通用的字符串表达框架
#针对字符串表达“简洁”和“特征”思想的工具
#----文本处理中十分常用
#语法:
#字符串{m} 扩展m次
#字符串{m, n} 扩展m-n次
#^字符串 字符串在开头
#字符串$ 字符串在结尾
#() 分组标记,内部只能使用|
#\d 数字,等价于0-9
#\w 单词字符,等价于[A-Za-z0-9]
import re
#原生字符串类型(r+字符串) raw string:不包含转义符的字符串
# re库的函数:
# search(pattern, string, flags=0)
# match()
# findall()
# split()
# finditer()
# sub()
实例:淘宝商品信息定向爬虫
#coding=gbk
#淘宝商品信息定向爬虫
#目标:获取淘宝页面的信息,提取其中的商品名称和价格
#理解:淘宝的搜索接口
# 翻页的处理
#技术路线:requests + re
#定向爬虫可行性:淘宝搜索页面不允许任何爬取(本例接近人类搜索行为,所以可以完成本实例)
#程序结构设计
#1. 提交商品搜索请求,循环获取页面
#2. 对于每个页面,提取商品信息和价格信息
#3. 将信息输出到屏幕上
import requests
import re
def getHTMLText(url):
try:
r = requests.get(url, timeout = 30)
r.raise_for_status()
r.ecoding = r.apparent_encoding
return r.text
except:
return ""
#从页面信息中提取商品信息和价格:用正则表达式的方式
def parsePage(ilt, html):
try:
plt = re.findall(r'"view_price":"[\d\.]*"', html)
tlt = re.findall(r'"raw_title":".*?"', html)
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])
title = eval(tlt[i].split(':')[1])
ilt.append([price, title])
except:
print("")
def printGoodList(ilt):
tplt = "{:4}\t{:8}\t{:16}"
print(tplt.format("序号", "价格", "商品名称"))
count = 0
for g in ilt:
count = count + 1
print(tplt.format(count, g[0], g[1]))
def main():
goods = '书包'
depth = 2
start_url = 'http://s.taobao.com/search?q='+goods
infoList = []
for i in range(depth):
try:
url = start_url + '&s=' + str(44*i)
html = getHTMLText(url)
parsePage(infoList, html)
except:
continue
printGoodList(infoList)
main()
Scrapy爬虫框架
#Scrapy爬虫框架
#Scrapy爬虫与requests库的比较
#scrapy常用命令--6个--scrapy命令行逻辑:程序员使用
#Scrapy demo: python123demo
#产生步骤:
#1. 建立一个Scrapy爬虫项目
#2. 在工程中产生一个Scrapy爬虫:给出命令行与所爬虫的网站---命令生成demo.py文件
#3. 配置产生的spider爬虫--修改demo.py文件,使其能够访问我们需要访问的链接并进行爬取,保存至文件
#4. 在命令行下,执行命令,进行爬虫---crawl命令;优化配置策略
# yield关键字:生成器
# 生成器常与循环关联使用
# 生成器相比于一次列出所有内容的优势:
# 1.更节省空间
# 2.响应更迅速
# 3.使用更灵活
#n=1M, 10M, 100M
#普通写法:所需所有的存储空间
#生成器yield写法:只需要一个空间,返回一次,更新一次i
#Scrapy爬虫的数据结构:
#Request类
#Response类
#Item类
Scrapy爬虫提取HTML信息的方法:
#Beautiful Soup
#Ixml
#re
#XPath Selector
#CSS Selector
#Scrapy博客-->具体学习与实践