超长警告⚠⚠慎入
参考源:中国MOOC,B站视频(遗憾已下架)
案例:课程案例+实践案例
传送门:
Python网络爬虫与信息提取_中国大学MOOC(慕课)www.icourse163.org文中介绍的比较详细的有,requests库,urllib.request库,BeautifulSoup库,re库和正则表达式,Scrapy常用命令。
#实例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('爬取失败')
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()
功能:解析、遍历、维护标签树。
...
参考链接:
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对象:
3.2 基本用法
搜索文档树:tag.name_按顺序获得第一个标签
获取所有标签?
tag.contents可以将tag的子节点以列表方式输出
tag.children,对tag的子节点进行循环
tag.descendants,子孙节点
tag.string,获取tag(只有一个子节点)下所有的文本内容
迭代的方式找出所有的文本内容
soup.get_text() #从文档中获取所有的文字内容
四、正则(信息提取)
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()
2.元字符-正则表达式中具有特殊含义的字符
3.模式修正符-在不改变正则表达式的前提下,调整匹配结果
4.贪婪模式和懒惰模式
贪婪模式:尽可能多的匹配字符,覆盖的范围更广
pat1="p.*y"
懒惰模式:尽可能少的匹配字符,可以更精确的定位
pat2="p.*?y"
5.正则表达式函数
前提:安装好scrapy,conda install scrapy(anaconda大法好!)
在cmd中,输入:scrapy -h
可以查看所有可用的命令
指定参数的话用两个短线,例如: --nolog #不显示日志
part1:全局命令
①fetch:用于显示爬虫爬取的过程
②runspider:可以不依托爬虫项目,运行爬虫文件
在cmd中:
输入cd 该py文件的路径
scrapy runspider ××.py
爬虫项目:可包括多个爬虫文件
③shell:启动scrapy的交互终端,开发调试,不启动scrapy项目的情况下,进行测试调试
exit() #退出shell窗口
④startproject:创建爬虫项目
scrapy startproject first
⑤version:查看版本信息
⑥view:下载某个网页并用浏览器查看
part2:项目命令
① bench:测试本地硬件的性能,只进行链接的跟进,不关注爬取内容
②check:检查某爬虫文件
③ crawl:运行某爬虫文件,可加控制参数
④ list:列出当前项目中,可使用的爬虫文件
⑤edit:编辑爬虫文件,限于linux系统,windows系统会报错
⑥parse:
--------------- ---------- 假的分割线 ----------- --------------- -----------
first文件夹
spiders爬虫文件夹
.cfg配置文件
创建爬虫文件:
查看可用的爬虫模板 scrapy genspider -l
利用basic模板创建爬取hao123的爬虫文件lina.py
相同点:都无法处理js、提交表单、应对验证码等问题
不同点:
#作业:抓取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/85445280zhuanlan.zhihu.com