python爬虫2021.7.24

本文是Python初学者的爬虫实战,通过使用BeautifulSoup和正则表达式,从某网站抓取新书速递的基本信息,包括书名、作者和出版社。主要涉及网页源码获取、正则表达式构建以及数据提取和清洗,最后将数据存入列表。文章还强调了模拟浏览器头部信息以避免被服务器识别为爬虫的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python爬虫学习1

时间:2021.7.24

实战1:爬取某网站新书速递基本信息

1、目的:检验对爬虫程序书写的流程,正则表达式的简单应用。

2、基本流程

1.需要用到的库

from bs4 import BeautifulSoup     #网页解析,获取数据
import re       #正则表达式,进行文字匹配
import urllib.request,urllib.error 

2.爬取网页源码

#获取网页源码
def askURL(url):
    head = { #模拟浏览器头部信息,向豆*服务器发送消息
        "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122  Safari / 537.36"
    }

    request = urllib.request.Request(url,headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
        #print(html)
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    return html

需要注意的问题:
此处需要模拟浏览器头部信息发送给服务器,因为服务器的响应包里会显示你是一只赤裸裸的爬虫,如果服务器加以过滤,爬取就会失败。所以伪装很有必要,这里只是简单地伪装。

head = { #模拟浏览器头部信息,向豆*服务器发送消息
        "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122  Safari / 537.36"
    }

2.正则表达式的构建
根据源码中书名、作者、出版社对应的H5代码对应规则构建正则表达式
例如:

#构造筛选的正则表达式
#re.S主要是考虑换行符
bookName = re.compile(r'<h4 class="title">(.*?)</h4>',re.S)
bookAuthor = re.compile(r'<div class="author">(.*?)</div>',re.S)
bookPublisher  =re.compile(r'<span class="publisher">(.*?)</span>',re.S)

注意:re.S主要是考虑换行符,如下

<h4 class="title">
                  人类状况百科全书(上下册)
                </h4>
`#正则匹配的时候如果不考虑换行符就会匹配失败

3.获取数据,存入列表中
后期存入数据或者EXCEL可自行增加一个函数将该列表存入即可。
需要注意的问题有:
存入时过滤掉爬下来的多余的空格、换行符等特殊字符。

附上源码,本文结束。

# 作者:QiQi_Cliff
# 时间:2021.7.24

#爬取豆*读书书名
from bs4 import BeautifulSoup     #网页解析,获取数据
import re       #正则表达式,进行文字匹配
import urllib.request,urllib.error 

#主函数
def main():
    baseurl = "https://book.dou*.com/"
    datalist = getData(baseurl)
    print(datalist)
    return 0

#构造筛选的正则表达式
bookName = re.compile(r'<h4 class="title">(.*?)</h4>',re.S)
bookAuthor = re.compile(r'<div class="author">(.*?)</div>',re.S)
bookPublisher  =re.compile(r'<span class="publisher">(.*?)</span>',re.S)
#从网页源码中拿数据
def getData(baseurl):
    datalist = []
    html = askURL(baseurl)

    soup = BeautifulSoup(html,"html.parser")#定位特定标签的位置
    i = 0
    for item in soup.find_all('div',class_="info"):
        if(i>=10):break
        i += 1
        data = [i]#将每一本书的信息都保存在列表中,最终汇总入datalist[]
        #查找符合要求的字符串,形成列表
        item = str(item)
        #print(item)

        #1.书名
        
        name = re.findall(bookName,item)[0] #此处这样做的原因就是:re.findall()函数得到的是一个列表,我们只需要还列表的第一个元素,即书名
        name = re.sub('<br(\s+)?/>(\s+)?'," ",name)   #去掉<br/>
        name = re.sub('/'," ",name)
        data.append(name.strip())

        #2.作者
        
        author = re.findall(bookAuthor,item)[0] #此处这样做的原因就是:re.findall()函数得到的是一个列表,我们只需要还列表的第一个元素,即书名
        author = re.sub('<br(\s+)?/>(\s+)?'," ",author)   #去掉<br/>
        author = re.sub('/'," ",author)
        data.append(author.strip())

        #3.出版社
        
        publisher = re.findall(bookPublisher,item)[0] #此处这样做的原因就是:re.findall()函数得到的是一个列表,我们只需要还列表的第一个元素,即书名
        publisher = re.sub('<br(\s+)?/>(\s+)?'," ",publisher)   #去掉<br/>
        publisher = re.sub('/'," ",publisher) 
        data.append(publisher.strip())

        datalist.append(data)
    return datalist
 #模拟浏览器头部信息,向豆*服务器发送消息

#获取网页源码
def askURL(url):
    head = { #模拟浏览器头部信息,向豆*服务器发送消息
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36 Edg/91.0.864.71"
    }

    request = urllib.request.Request(url,headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")#防止解码错误
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    return html


#启动的主函数
if __name__ == "__main__":          #当程序执行时
#调用函数
    main()
    print("爬取完毕!")

部分源代码参考IT私塾,希望本文对你有帮助。python小白第一次发文还请大家多多指教/握拳。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值