python学习笔记——爬虫

python学习笔记


爬虫

requests模块

requests模块用于给浏览器发送请求,请求分为get和post两种类型,其中post请求为需要携带信息,例如登录用户名和密码等信息。代码示例如下:

  • get请求
import requests,json
url = 'http://baidu.com'
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
        "cookie": "你的cookie"
}
params = {
    'page' : '1'
} #url携带的参数,可以在F12的Headers中找到
res = requests.get(url,headers=headers,params=params)
res_text = res.text	#返回文本形式
res_json = res.json()	#返回json形式,字典对象
res_content =res.content	#返回二进制形式
  • post请求

post请求只有参数部分与get请求有差异。

data = {
    'username' :'111'
    'key': 'XXXXXX'
} #post携带的参数,可以在F12的Headers中找到
res = requests.post(url,headers=headers,data=data).text

bs4模块

  • 数据解析原理

    1. 标签定位
    2. 提取标签、标签属性中存储的数据值
  • 实例化BeautifulSoup对象

    1. 本地html文档
    import lxml
    from bs4 import BeautifulSoup
    fp = open('./test.html','r',encoding='utf-8')
    soup = BeautifulSoup(fp,'lxml')
    
    1. 互联网的页面源码
    page_text = response.text
    soup = BeautifulSoup(page_text,'lxml')
    
  • 直接选择

soup.tagName:返回文档中第一次出现tagName对应的标签

  • find和findall

soup.find(tagName):返回文档中第一次出现tagName对应的标签

soup.find(tagName,class_/id/attr=‘xxx’):属性定位

soup.find_all(‘tagName’):以列表形式返回符合要求的全部内容

  • select

select(‘某种选择器(id,class,attr…)’):返回一个列表

层级选择器:

soup.select('.tang>ul>li>a'):表示一个层级,第一个tang代表class属性为tang,最终返回一个列表

soup.select(‘.tang>ul a’):空格表示多个层级

  • 获取标签文本

soup.a.text/string/get_text()

text/get_text():可以获取某一个标签中所有的文本内容
string:只可以获取该标签下面直系的文本内容

  • 获取标签属性

soup.a['href']

  • bs4代码示例
#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
#需求:爬取三国演义小说所有的章节标题和章节内容http://www.shicimingju.com/book/sanguoyanyi.html
if __name__ == "__main__":
    #对首页的页面数据进行爬取
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
    }
    url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
    page_text = requests.get(url=url,headers=headers).text

    #在首页中解析出章节的标题和详情页的url
    #1.实例化BeautifulSoup对象,需要将页面源码数据加载到该对象中
    soup = BeautifulSoup(page_text,'lxml')
    #解析章节标题和详情页的url
    li_list = soup.select('.book-mulu > ul > li')
    fp = open('./sanguo.txt','w',encoding='utf-8')
    for li in li_list:
        title = li.a.string
        detail_url = 'http://www.shicimingju.com'+li.a['href']
        #对详情页发起请求,解析出章节内容
        detail_page_text = requests.get(url=detail_url,headers=headers).text
        #解析出详情页中相关的章节内容
        detail_soup = BeautifulSoup(detail_page_text,'lxml')
        div_tag = detail_soup.find('div',class_='chapter_content')
        #解析到了章节的内容
        content = div_tag.text
        fp.write(title+':'+content+'\n')
        print(title,'爬取成功!!!')

xpath解析

  • 实例化etree对象
  1. 将本地的html文档中的源码数据加载到etree对象中:etree.parse(filePath)
  2. 可以将从互联网上获取的源码数据加载到该对象中etree.HTML('page_text')
  • xpath表达式
    • /:表示的是从根节点开始定位。表示的是一个层级。
    • //:表示的是多个层级。可以表示从任意位置开始定位。
    • 属性定位://div[@class='song'] tag[@attrName="attrValue"]
    • 索引定位://div[@class="song"]/p[3]索引是从1开始的。
    • 取文本:
      • /text()获取的是标签中直系的文本内容
      • //text()标签中非直系的文本内容(所有的文本内容)
    • 取属性:
      /@attrName ==>img/src
  • xpath代码示例
#!/usr/bin/env python 
# -*- coding:utf-8 -*-
#需求:解析下载图片数据
import requests
from lxml import etree
import os
if __name__ == "__main__":
    url = 'http://pic.netbian.com/4kmeinv/'
    headers = {
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }
    response = requests.get(url=url,headers=headers)
    #手动设定响应数据的编码格式
    # response.encoding = 'utf-8'
    page_text = response.text

    #数据解析:src的属性值  alt属性
    tree = etree.HTML(page_text)
    li_list = tree.xpath('//div[@class="slist"]/ul/li')


    #创建一个文件夹
    if not os.path.exists('./picLibs'):
        os.mkdir('./picLibs')

    for li in li_list:
        img_src = 'http://pic.netbian.com'+li.xpath('./a/img/@src')[0]
        img_name = li.xpath('./a/img/@alt')[0]+'.jpg'
        #通用处理中文乱码的解决方案
        img_name = img_name.encode('iso-8859-1').decode('gbk')

        # print(img_name,img_src)
        #请求图片进行持久化存储
        img_data = requests.get(url=img_src,headers=headers).content
        img_path = 'picLibs/'+img_name
        with open(img_path,'wb') as fp:
            fp.write(img_data)
            print(img_name,'下载成功!!!')

re模块

常用匹配规则

\w		匹配字母、数字、下划线,等价于[a-zA-Z0-9_] \w可以匹配汉字(python),
\W		匹配不是字母、数字、下划线的其他字符
\s		匹配任意空白字符,等价于(\t\n\r\f)
\S		匹配任意非空字符
\d		匹配数字,等价于[0-9]
\D		匹配不是数字的字符
\A		匹配字符串开头
\Z		匹配字符串结尾的,如果存在换行,只匹配到换行前的结束字符串
\z		匹配字符串结尾的,如果存在换行,同时匹配换行符
\G		匹配最后完成匹配的位置
\n		匹配一个换行符
\t		匹配一个制表符(tab)
^		匹配一行字符串的开头
$		匹配一行字符串的结尾
.		匹配任意字符,除了换行符.当re.DOTALL标记被指定时,这可以匹配包括换行符在内的任字符
[…]		用来表示一组字符,比如[abc]表示匹配a或b或c,[a-z],[0-9]
[^…]	匹配不在[]里面的字符,比如[^abc]匹配除a,b,c以外的字符
*		匹配0个或多个字符
+		匹配1个或多个字符
?		匹配0个或1个前面的正则表达式片段,(.*?)表示尽可能少地匹配字符(后面详解)
{n}		精确匹配前面n个前面的表达式,如\d{5}表示匹配5个数字
{n,m}	匹配前面的表达式n到m次,贪婪模式
a|b		匹配a或者b
(…)		匹配括号里的表达式,也可以表示一个组
常用组合匹配规则:
.*:匹配0个或多个出换行符以外的任意字符

修饰符

re.I:使得匹配不区分大小写
re.L:做本地化识别匹配
re.M:多行匹配,对匹配开头^和结尾$有影响
re.S:使得.匹配包括换行符在内的所有字符
re.U:根据Unicode字符集解析字符
re.X:赋予更灵活的格式有助于正则表达式的理解

相关函数

re.match(pattern,string,modifier),
其中pattern是正则表达式,string是要匹配的字符串,modifier是修饰符控制正则的匹配方式。
re.search()
说明:与match区别在于,match从头开始匹配,一旦字符串开始位置不符合正则表达式就会匹配失败;search匹配整个字符串。
re.findall()
说明:当被匹配的字符串中有多个符合正则表达式时,使用re.findall()可以获得符合正则表达式的所有内容。
re.sub(pattern,replace,string),
其中pattern是被替代的字符的正则表达式,replace是用于替换的字符,string是要匹配的字符串
说明:sub()的意义在于可以快速对匹配的字符串进行处理,比如去除掉字符串中的数字字符
re.compile(pattern,modifier)
说明:compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。其中pattern是正则表达式,modifier是修饰符。

本部分主要参考出处

多线程

Pool模块用于阻塞式进程,map(functionName,paramList)函数实现多进程,functionName函数只能有一个参数,如果本身需要多个参数可以用列表或字典等封装。

#多线程

# coding=utf-8
import requests,os,re
from multiprocessing.dummy import Pool
import time
#---------------批量并行下载视频-----------------------
def download(link):
    video_path = './Bilibili'
    print('\n开始下载...',link)
    os.system('you-get -o %s %s' % (video_path,link))
    print('\n下载完毕',link)

def main():
    if not os.path.exists('./Bilibili'):
        os.mkdir('./Bilibili')
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
        }
    search_name = input('video keyword:')
    pages = 2 #设置爬取的总页数
    video_path = './Bilibili'#视频保存路径
    for page in range(1,pages):#翻页循环
        url = ('https://search.bilibili.com/all?keyword='+search_name+'&single_column=0&page='+str(page)) #翻页循环设定
        res = requests.get(url,headers=headers).text
        links = re.findall(r'<li class="video-item matrix"><a href="(.*?)" title=',res)#使用正则表达式从源码中找到所有视频地址
        links = ['https:'+link for link in links]

    pool = Pool(10)
    pool.map(download,links)
    pool.close()
    pool.join()
尚硅谷是一个提供在线教育的学习平台,他们提供了Python爬虫的相关教学课程。通过学习这些课程,你可以获得Python基础知识、前端基础知识、计算机网络基础以及爬虫原理等方面的知识。Python基础教学可以参考B站尚硅谷的教学视频,这些视频可以帮助你建立起对Python的基本认识。而前端基础知识包括HTML、CSS和JavaScript的学习,它们分别代表网页的骨架、肌肉和皮肤,只有结合起来才能形成一个完整的网页。此外,你还可以通过学习计算机网络基础来理解HTTP和HTTPS、URL以及网页请求等内容。爬虫原理也是其中的一部分内容,它可以帮助你了解如何通过爬虫程序获取网页数据。所以,如果你对Python爬虫感兴趣,尚硅谷提供的Python爬虫课程可能是一个不错的选择。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [零基础自学python爬虫笔记Day1——爬虫的基本原理](https://blog.csdn.net/Seyhang/article/details/119420052)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【Python爬虫】urllib库——尚硅谷](https://blog.csdn.net/qq_48108092/article/details/126097408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值