exists的用法 python_Python爬虫笔记汇总

超长警告⚠⚠慎入

参考源:中国MOOC,B站视频(遗憾已下架)

案例:课程案例+实践案例

传送门:

Python网络爬虫与信息提取_中国大学MOOC(慕课)​www.icourse163.org
exists的用法 python_Python爬虫笔记汇总_第1张图片

文中介绍的比较详细的有,requests库,urllib.request库,BeautifulSoup库,re库和正则表达式,Scrapy常用命令。

exists的用法 python_Python爬虫笔记汇总_第2张图片

一、requests库

exists的用法 python_Python爬虫笔记汇总_第3张图片
  • 课程小案例
  1. 京东商品详情页
#实例1:爬取京东商品详情页
import requests
url='http://item.jd.com/2967929.html'
try:
    r=requests.get(url)
    r.raise_for_status()  #检查Response状态码,若不是200则产生HttpError异常
    r.encoding=r.apparent_encoding
    print(r.text[:1000])
except:
    print("爬取失败")

2. 亚马逊商品详情页

#实例2:爬取亚马逊商品详情页————协议头
url='https://www.amazon.cn/dp/B076YGLN6G?smid=A3CQWPW49OI3BQ&ref_=Oct_CBBBCard_dsk_asin2&pf_rd_r=X83064H6KVVDTZ4WWDFB&pf_rd_p=5a0738df-7719-4914-81ee-278221dce082&pf_rd_m=A1AJ19PSB66TGU&pf_rd_s=desktop-3'
try:
    res = requests.get(url)
    res.raise_for_status()        #503
    res.encoding=r.apparent_encoding   #'ISO-8859-1'
    print(res.text[:1000])
except:
    print("爬取错误")

'''
res.request.headers
Out[7]: {'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
'''

try:
    kv={'user-agent':'Mozilla/5.0'}  #浏览器身份标识的字段
    r=requests.get(url,headers=kv)
    r.raise_for_status()  #r.status_code   200
    r.encoding=r.apparent_encoding
    print(r.text[1000:3000])
except:
    print("爬取失败")

3. 百度/360搜索关键字

#实例3:爬取搜索页面
import requests
try:
    kw={'wd':'python'}
    r=requests.get('https://www.baidu.com/s',params=kw)
    r.raise_for_status()
    r.encoding=r.apparent_encoding
    print(len(r.text))
    #r.request.url  返回的是百度安全验证的链接?
except:
    print("爬取失败")


import requests
try:
    kw={'q':'python'}  #360搜索的关键字的键为q
    r=requests.get('https://www.so.com/s',params=kw)
    r.raise_for_status()
    r.encoding=r.apparent_encoding
    print(len(r.text))  #257468
except:
    print("爬取失败")

4. 网络图片爬取及存储

#实例4:爬取图片
'''r.content  #表示返回内容的二进制格式'''
import requests
import os
root='./Pic/'
path=root+url.split('/')[-1].split('@')[0]
url='http://img0.dili360.com/ga/M00/02/AB/wKgBzFQ26i2AWujSAA_-xvEYLbU441.jpg@!rw9'
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("爬取失败")

5. IP地址归属地查询

#实例5:IP地址归属地查询
import requests
url='http://www.ip138.com/iplookup.asp?ip='
try:
    r=requests.get(url+'183.216.163.144',headers=kv)
    r.raise_for_status()
    r.encoding=r.apparent_encoding
    print(r.text[:-500])
except:
    print('爬取失败')

二、urllib.request基础

1.urllib基础:

urllib.request.urlretrieve(url,file)  #将网页保存到本地,参数为抓取的网址和保存网页的文件路径
urllib.request.urlcleanup()    #将urlretrieve产生的缓存清除
file=urllib.request.urlopen(url)  #爬取网页
file.info()    #获取header的信息
file.getcode()   #获取爬取网页的状态码(200,403,404等)
file.geturl()     #获取目前爬取的网址

2.超时设置:根据网速和对方服务器响应的快慢设置相应的超时设置

urllib.request.urlopen("http://read.douban.com/provider/all",timeout=1)

for i in range(0,100):
    try:
        file=urllib.request.urlopen("http://www.hao123.com",timeout=10)
        data=file.read()
        print(i,len(data))
    except Exception as e:
        print("出现异常"+str(e))

3.自动模拟http请求:

①get请求(搜索某些内容)

自动在百度上搜索关键词,获得搜索界面

#get请求

keywd="Python"
url="http://www.baidu.com/s?wd="+keywd  #网址构造
print(url)
req=urllib.request.Request(url) #以请求的方式获取,网址
data=urllib.request.urlopen(req).read()

fh=open("C:/Users/admin/Desktop/a.html","wb") #以二进制写入html文件
fh.write(data)
fh.close()

#若搜索关键词为中文
keywd1="亚马孙"
keywd1=urllib.request.quote(keywd1)  #利用quote对中文进行编码
url1="http://www.baidu.com/s?wd="+keywd1
req=urllib.request.Request(url1)
data=urllib.request.urlopen(req).read()

fh=open("C:/Users/admin/Desktop/a.html","wb") #二进制
fh.write(data)
fh.close()

②post请求(登录某些网站)

#post请求
import urllib.request
import urllib.parse

url="https://www.iqianyue.com/mypost/"  #地址
login=urllib.parse.urlencode(
    {"name":"[email protected]","pass":"123"}
).encode("utf-8")  #登录数据
req=urllib.request.Request(url,login)

data=urllib.request.urlopen(req).read()

fh=open("C:/Users/admin/Desktop/a.html","wb")
fh.write(data)
fh.close()

三、bs4库

功能:解析、遍历、维护标签树。

...

  • 标签名 p
  • 属性名称 class
  • 属性值 title

参考链接:

https://blog.csdn.net/qq_35490191/article/details/80598620

3.1 BeautifulSoup支持的解析器

1.Python标准库:内置库、执行速度适中、文档容错能力强;

2.lxml HTML解析器:速度快,文档容错能力强(推荐);

3.lxml XML解析器:速度快,唯一支持xml的解析器;

4.html5lib:最好的容错性、以浏览器方式解析文档,生成HTML5格式的文档。

具体用法:soup=BeautifulSoup(markup,from_encoding="编码方式")

html = """
The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were Elsie , Lacie and Tillie; and they lived at the bottom of a well.

...

""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.prettify()) #输出清晰的树形结构

Beautifu Soup将复杂的HTML文档转化为树形结构,每个节点都是Python对象:

  • Tag:标签;
  • NavigableString:被包裹在tag内的字符串;
  • BeautifulSoup:表示一个文档的全部内容,大部分时候可以看做一个tag对象,支持遍历文档树和搜索文档树的方法;
  • Comment:特殊NavigableString,会以特殊格式输出,比如注释类型。

3.2 基本用法

搜索文档树:tag.name_按顺序获得第一个标签

exists的用法 python_Python爬虫笔记汇总_第4张图片

获取所有标签?

exists的用法 python_Python爬虫笔记汇总_第5张图片

tag.contents可以将tag的子节点以列表方式输出

exists的用法 python_Python爬虫笔记汇总_第6张图片

tag.children,对tag的子节点进行循环

tag.descendants,子孙节点

exists的用法 python_Python爬虫笔记汇总_第7张图片

tag.string,获取tag(只有一个子节点)下所有的文本内容

187ee3dccf4923eed396ed9fc0b6c3f8.png

迭代的方式找出所有的文本内容

exists的用法 python_Python爬虫笔记汇总_第8张图片

soup.get_text() #从文档中获取所有的文字内容

ccdc95efc24ffa28475e34b0f5f8dc75.png

exists的用法 python_Python爬虫笔记汇总_第9张图片

四、正则(信息提取)

exists的用法 python_Python爬虫笔记汇总_第10张图片
  • 中国大学排名案例
import requests
from bs4 import BeautifulSoup
import bs4

#爬取信息
def getHtmlText(url):
  try:
    res=requests.get(url,timeout=30)
    res.raise_for_status()
    res.encoding=res.apparent_encoding
    return res.text
  except:
    print("error")
    return ""

#提取信息
def fillUnivList(ulist,html):
  soup=BeautifulSoup(html,"html.parser")
  for tr in soup.find("tbody").children:
    if isinstance(tr,bs4.element.Tag): #检测tr标签的类型
      tds=tr('td')
      ulist.append([tds[0].string,tds[1].string,tds[2].string])

#打印信息  
def printUnivList(ulist,num): #学习数量
  tplt="{0:^10}t{1:{3}^12}t{2:^9}" #{}域,格式化输出
  #表头
  print(tplt.format("排名","学校","地址",chr(12288)))
  for i in range(num):
    u=ulist[i]
    print(tplt.format(u[0],u[1],u[2],chr(12288)))
  print("Suc"+str(num))

#chr(12288)中文空格,解决中英文混排的问题

def mian():
  uinfo=[]
  url='http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html'
  html=getHtmlText(url)
  fillUnivList(uinfo,html)
  printUnivList(uinfo,20)
mian()

exists的用法 python_Python爬虫笔记汇总_第11张图片
  1. 常见的原子类型-正则表达式最基本的单位
  • a.普通字符(如:a,b,z,0,9)

d2225f6ac75d3b89458c2a200e6f6f23.png
  • b.非打印字符(如:制表符t、换行符n等)

cf0b61b477c4646fe95b641cce2af2f2.png
  • c.通用字符(可匹配一系列内容,如:可匹配任意一个十进制数d;可匹配任意一个除十进制数之外的字符D;可匹配任意一个数字、字母或下划线w;可匹配任意一个除数字、字母、下划线外的字符W;可匹配任意一个空白字符s;可匹配任意一个除空白字符之外的字符S)

16d83cb2ff4ef4aca5e77cb558ee957f.png
  • d.原子表(原子表内的原子处于同一地位,如:[jsz])

c0b58d036a1b560d05b94a2ef4cc30bf.png

2.元字符-正则表达式中具有特殊含义的字符

  • . 匹配任意字符
  • ^ 匹配搜索字符串开始的位置
  • $ 匹配字符串结束的位置
  • * 匹配前面字符的0次、1次、多次
  • ? 匹配前面字符的0次、1次
  • + 匹配前面字符的1次、多次
  • {n} 表示左括号前的原子恰好出现n次
  • {n,} 表示左括号前的原子至少出现n次
  • {n,m} 表示左括号前的原子至少出现n次,最多出现m次
  • | 模式选择符,或
  • () 用于提取内容

3.模式修正符-在不改变正则表达式的前提下,调整匹配结果

  • re.I #让正则表达式不区分大小写

exists的用法 python_Python爬虫笔记汇总_第12张图片
  • re.M #可以进行多行匹配
  • re.L #△本地化识别匹配
  • re.U #根据unicode字符解析字符
  • re.S # 使得 . 可以匹配换行符,通常.无法匹配换行符

3c7431949c6cd45d4e2a5d410059b6df.png

4.贪婪模式和懒惰模式

贪婪模式:尽可能多的匹配字符,覆盖的范围更广

pat1="p.*y"

懒惰模式:尽可能少的匹配字符,可以更精确的定位

pat2="p.*?y"

exists的用法 python_Python爬虫笔记汇总_第13张图片

5.正则表达式函数

  • re.search() #从左至右搜索,只会输出首次满足匹配条件的内容
  • re.match() #从头搜索符合条件的字符/字符串,待搜索的字符必须在最开始的位置
  • re.sub() #替换
  • re.complie(pattern).findall(string) #全局匹配函数

五、Scrapy爬虫框架

exists的用法 python_Python爬虫笔记汇总_第14张图片

前提:安装好scrapy,conda install scrapy(anaconda大法好!)

在cmd中,输入:scrapy -h

可以查看所有可用的命令

指定参数的话用两个短线,例如: --nolog #不显示日志

part1:全局命令

①fetch用于显示爬虫爬取的过程

exists的用法 python_Python爬虫笔记汇总_第15张图片

②runspider:可以不依托爬虫项目,运行爬虫文件

在cmd中:

输入cd 该py文件的路径

scrapy runspider ××.py

爬虫项目:可包括多个爬虫文件

③shell:启动scrapy的交互终端,开发调试,不启动scrapy项目的情况下,进行测试调试

exists的用法 python_Python爬虫笔记汇总_第16张图片

exit() #退出shell窗口

④startproject:创建爬虫项目

scrapy startproject first

2ba335806018c79616f1e6a232060afb.png

⑤version:查看版本信息

89e1689a16c0522c6059e4d7a0089f95.png

⑥view:下载某个网页并用浏览器查看

part2:项目命令

bench:测试本地硬件的性能,只进行链接的跟进,不关注爬取内容

exists的用法 python_Python爬虫笔记汇总_第17张图片

②check:检查某爬虫文件

exists的用法 python_Python爬虫笔记汇总_第18张图片

crawl:运行某爬虫文件,可加控制参数

exists的用法 python_Python爬虫笔记汇总_第19张图片

list:列出当前项目中,可使用的爬虫文件

⑤edit:编辑爬虫文件,限于linux系统,windows系统会报错

dfa95f44f93bc17416b3b90bf88314a2.png

parse:

exists的用法 python_Python爬虫笔记汇总_第20张图片

--------------- ---------- 假的分割线 ----------- --------------- -----------

first文件夹

exists的用法 python_Python爬虫笔记汇总_第21张图片

spiders爬虫文件夹

  1. __init__ 初始化文件
  2. Items 目标文件
  3. pipelines 文件的后续处理
  4. setttings 设置:如伪装浏览器,开启cookies,开启pipeline

.cfg配置文件

创建爬虫文件:

查看可用的爬虫模板 scrapy genspider -l

exists的用法 python_Python爬虫笔记汇总_第22张图片

利用basic模板创建爬取hao123的爬虫文件lina.py

5ff4ddc8b51f5e8f4415259721d8b2b9.png

exists的用法 python_Python爬虫笔记汇总_第23张图片

requests库 vs Scrapy库

相同点:都无法处理js、提交表单、应对验证码等问题

不同点:

exists的用法 python_Python爬虫笔记汇总_第24张图片

其他实践案例:

  • 抓取CSDN首页全部博文
#作业:抓取csdn首页全部博文
import urllib.request
import re

url="http://blog.csdn.net/"
homepage=urllib.request.urlopen(url).read().decode('utf-8',"ignore")
print(len(homepage))

pat='
https://zhuanlan.zhihu.com/p/69326024​zhuanlan.zhihu.com
https://zhuanlan.zhihu.com/p/72387414​zhuanlan.zhihu.com
https://zhuanlan.zhihu.com/p/73872570​zhuanlan.zhihu.com
https://zhuanlan.zhihu.com/p/77057222​zhuanlan.zhihu.com
https://zhuanlan.zhihu.com/p/75143252​zhuanlan.zhihu.com
https://zhuanlan.zhihu.com/p/63412016​zhuanlan.zhihu.com
https://zhuanlan.zhihu.com/p/75211350​zhuanlan.zhihu.com

其他笔记:

https://zhuanlan.zhihu.com/p/85445280​zhuanlan.zhihu.com

你可能感兴趣的:(exists的用法,python)