前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >暑假学习爬虫の笔记

暑假学习爬虫の笔记

作者头像
Moemu
发布2023-05-04 13:20:38
2200
发布2023-05-04 13:20:38
举报
文章被收录于专栏:Moemu's NotepadMoemu's Notepad

下载文件

代码语言:javascript
复制
import requests as r
url='https://muspace.top/index.html' #下载地址
name='My file' #下载文件名
file=r.get(url) #下载ing...
open(name,'wb').write(file.ccontent) #写入文件

但有机率报错:

代码语言:javascript
复制
InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. 
See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning

解决方法:

代码语言:javascript
复制
import urllib3
urllib3.disable_warnings()

爬虫时指定User-Agent

代码语言:javascript
复制
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
response = request.get(url,headers=headers)

BeautifulSoup库

代码语言:javascript
复制
#解析网页信息
from re import split
import bs4
import requests as r
from bs4 import BeautifulSoup as bs

headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'} #指定UA
html=r.get('https://muspace.top/index.html',headers=headers) #页面的html文件
text=html.text
tree=bs(text,'lxml') #将HTML 文档转换成树形结构

#提取信息的第一种方式
def item():
    #site-title(F12->定位数据并右键->“复制”➔“复制Selector”)
    data=tree.select('#site-title') #引用路径
    print('data:',data) #此时输出的是目标的HTML代码:[<h1 id="site-title">沐の空间</h1>]
    for item in data:
        result={
            'title':item.get_text(), #获取文本
            'link':item.get('href') #获取链接
        }
    print(result) #{'title': '沐の空间', 'link': None}
    result=result['title']
    print(result) #沐の空间

#提取信息的第二种方式
def find():
    tag=tree.find('h1') #使用find方法查到第一个h1标签(标签所处的HTML代码通常是:<h1 id="site-title">沐の空间</h1>)
    #遍历搜索的所有结果
    def finds():
        for i in tree.find('div'):
            print(i)
    input('按任意键')
    print(tag) #输出find获取到的值:<h1 id="site-title">沐の空间</h1>
    print(tag.name) #输出标签的名字:h1
    print(tag['id']) #输出标签的id属性值:site-title
    print(tag.string) #输出标签中的文本:沐の空间

#检查内容是不是注释
def check():
    import bs4
    markup = "<b><!--我打赌你肯定在看源代码--></b>" #注释本释
    soup = bs(markup,'lxml') #将HTML 文档转换成树形结构(梅开二度)
    comment = soup.b.string #提取文本信息(但是注释的类型为:bs4.element.Comment)
    if type(comment) == bs4.element.Comment:
        print('该字符是注释')
    else:
        print('该字符不是注释')

def findall():
    print(tree.find_all('title')) # 搜索文档树 输出:[<title>沐の空间 - 做自己的学习笔记</title>]
    # 完整语法为find_all(name , attrs , recursive , string , **kwargs )
    # name 参数:可以查找所有名字为 name 的tag。
    # attr 参数:就是tag里的属性。
    # string 参数:搜索文档中字符串的内容。
    # recursive 参数: 调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点。如果只想搜索tag的直接子节点,可以使用参数 recursive=False 。
    def example():
        print(tree.find_all('div', 'top_part')) #输出:[<div class="top_part"></div>, <div class="top_part"></div>, <div class="top_part"></div>]
        print(tree.find_all('p')) #输出:[<p style="text-align:center">   loading...</p>]
        print(tree.find_all(id='web_bg')) #输出:[<div id="web_bg"></div>]
        import re
        print(tree.find(string=re.compile("沐の空间"))) #输出:沐の空间 - 做自己的学习笔记
    example()

实战演练1

代码语言:javascript
复制
#实战演练(爬取沐の空间上面的文章cover图)
def useful():
	from re import split
	import requests as r
	from bs4 import BeautifulSoup as bs
    import shutil,os,bs4
    #新建img目录以便于存放爬取后的图片
    os.system('md img')
    imgdir=os.path.dirname(os.path.abspath(__file__))+'\img'
    #获取html文件
    web=r.get('https://muspace.top/index.html')
    #对数据进行处理
    text=web.text
    tree=bs(text,'lxml')
    data=tree.find_all('img') #寻找带有img标签的语句
    #遍历所有结果并对其进行处理
    for img in data:
        a=img['src'] #获取下载链接
        try:
            #适用于:https://cdn.jsdelivr.net/gh/WhitemuTeam/web-img/img/xxx.jpg
            name=a.split('/img/') #分块并获取名字
            name=name[1]
        except:
            try:
                #适用于:https://cdn.jsdelivr.net/gh/WhitemuTeam/web-img/xxx.jpg
                name=a.split('/web-img/')
                name=name[1]
            except:
                #其他的都不爬取
                continue
        try:
            #尝试下载,如果报错就是存在重复图片
            get=r.get(a)
            open(name,'wb').write(get.content)
            print('已保存图片',name)
            shutil.move(name,imgdir) #剪切文件
        except:
            continue
    print('爬取已完成')

if __name__=='__main__':
    useful()

get传递参数

代码语言:javascript
复制
import requests as r
payload = {'key1': 'value1', 'key2': 'value2'}
r = r.get("http://httpbin.org/get", params=payload)
#get的网址实际为:http://httpbin.org/get?key1=value1&key2=value2

获取网页上的文字

注意:该网页内容必须为:text(content-type: text/plain; charset=utf-8)

代码语言:javascript
复制
import requests as r
web=r.get('https://v1.hitokoto.cn/?encode=text')
web.encoding='utf-8' #对文字进行编码(可选)
sen=web.text #输出文字

实战演练2

爬取小说

代码语言:javascript
复制
# -*- coding:UTF-8 -*-
import requests as r
from bs4 import BeautifulSoup as bs

#指定UA
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.73'}

#爬取目录
def geturl():
    global text  
    url='https://www.bqkan8.com/25_25963/' #目录链接
    html=r.get(url,headers=headers) #开始爬取
    html.encoding='gbk' #网站使用gbk编码
    html=html.text
    tree=bs(html,'lxml') #将html转化为树形结构    
    title=tree.find_all('a') #寻找带有a标签的语句
    num=0 #统计title数量
    for i in title:
        num=num+1
    text=open('page.txt','w',encoding='utf-8') #创建txt文件以用于存放小说
    for i in range(num): #循环获取每章节的链接
        purl=title[i+41]
        purl='https://www.bqkan8.com/'+purl['href']
        page(purl)
    text.close() #保存退出
    input('爬取完毕')

#爬取每章节的文章
def page(url): 
    html=r.get(url,headers=headers).text
    tree=bs(html,'lxml')
    title=tree.find('title').string.split('_')[0] #获取标题
    page=tree.find_all(id='content')[0].text.split('  (')[0].replace('  ','\n\n') #获取正文
    print(title,file=text)
    print(page,file=text)
    print('爬取',title,'已完成')

if __name__=='__main__':
    geturl()

从XML提取信息

temp.xml:

未经格式化:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?><images><image><startdate>20210813</startdate><fullstartdate>202108130900</fullstartdate><enddate>20210814</enddate><url>/th?id=OHR.UbehebeCrater_ZH-CN0157876978_1920x1080.jpg&amp;rf=LaDigue_1920x1080.jpg&amp;pid=hp</url><urlBase>/th?id=OHR.UbehebeCrater_ZH-CN0157876978</urlBase><copyright>死亡谷国家公园里的优比喜比火山口,加利福尼亚州 (© Albert Knapp/Alamy)</copyright><copyrightlink>https://www.bing.com/search?q=%E6%AD%BB%E4%BA%A1%E8%B0%B7%E5%9B%BD%E5%AE%B6%E5%85%AC%E5%9B%AD&amp;form=hpcapt&amp;mkt=zh-cn</copyrightlink><headline></headline><drk>1</drk><top>1</top><bot>1</bot><hotspots></hotspots></image><tooltips><loadMessage><message>正在加载...</message></loadMessage><previousImage><text>上一个图像</text></previousImage><nextImage><text>下一个图像</text></nextImage><play><text>播放视频</text></play><pause><text>暂停视频</text></pause></tooltips></images>

经格式化

代码语言:javascript
复制
<images>
	<image>
		<startdate>20210813</startdate>
		<fullstartdate>202108130900</fullstartdate>
		<enddate>20210814</enddate>
		<url>/th?id=OHR.UbehebeCrater_ZH-CN0157876978_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp</url>
		<urlBase>/th?id=OHR.UbehebeCrater_ZH-CN0157876978</urlBase>
		<copyright>死亡谷国家公园里的优比喜比火山口,加利福尼亚州 (© Albert Knapp/Alamy)</copyright>
		<copyrightlink>https://www.bing.com/search?q=%E6%AD%BB%E4%BA%A1%E8%B0%B7%E5%9B%BD%E5%AE%B6%E5%85%AC%E5%9B%AD&form=hpcapt&mkt=zh-cn</copyrightlink>
		<headline/>
		<drk>1</drk>
		<top>1</top>
		<bot>1</bot>
		<hotspots/>
	</image>
<tooltips>
	<loadMessage>
		<message>正在加载...</message>
	</loadMessage>
	<previousImage>
		<text>上一个图像</text>
	</previousImage>
	<nextImage>
		<text>下一个图像</text>
	</nextImage>
	<play>
		<text>播放视频</text>
	</play>
	<pause>
		<text>暂停视频</text>
	</pause>
	</tooltips>
</images>

Python源码:

代码语言:javascript
复制
from xml.dom import minidom
dom=minidom.parse("temp.xml") #加载和读取XML文件
root=dom.documentElement #获取XML文档对象
msg = root.getElementsByTagName('copyright') #数据所在节点名
information1 = msg[0].firstChild.data #获取文本名
print('拍摄地(作者):',information1)

post

代码语言:javascript
复制
import requests as r
import json

#部分数据需要到F12->网络->XHR->xxx获取
def http():
    mydata={'value1':'abc'} #表单数据:
    url='http://httpbin.org/post' #请求地址
    back=r.post(url,data=mydata) #post
    sen=json.loads(back.text) #格式化数据
    fin=sen['form'] #提取form数据
    print(fin) #输出结果

if __name__=='__main__':
    http()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 下载文件
  • 爬虫时指定User-Agent
  • BeautifulSoup库
  • 实战演练1
  • get传递参数
  • 获取网页上的文字
  • 实战演练2
  • 从XML提取信息
  • post
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档