python网络爬虫与信息提取1基础知识

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库:解析、遍历、维护“标签树”的功能集合库在这里插入图片描述

在这里插入图片描述

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博客-->具体学习与实践
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值