BeautifulSoup初体验

本文介绍了使用Python的Scrapy框架及BeautifulSoup库进行网页爬取的方法,包括配置模拟浏览器、解析HTML元素等内容,并提供了从特定网站抓取图片和信息的实际案例。

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

欲学爬虫,scrapy是python的重点,scrapy是框架,核心还是解析html元素,这方面专业的还是BeautifulSoup。
这是官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#id9
多看官方文档,多练习,基本上可以掌握的很清晰!
1 配置
1,1配置模拟浏览器

from   bs4 import  BeautifulSoup
import  requests
url='http://example.com/'
header = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20100101 Firefox/36.0'}Gecko/20100101 Firefox/36.0'}
response = requests.get(url, headers=header)
html=response.text
soup=BeautifulSoup(html,'lxml')#这里可以指定解析器类型 lxml,html.parser
print  soup.p

各个解析器的特点
这里写图片描述
beautifulsoup负责获取对象,或者对象的集合,剩下来比较重要的就是迭代集合和输出结果
2 bs解析原理
soup=BeautifulSoup(html,’lxml’)
soup.a —-< ‘a href=”http://www.iana.org/domains/example”>More information…<’/’a>
soup.a.attrs ——{‘href’: ‘http://www.iana.org/domains/example‘}
soup.a.text ———-More information…
soup.a[‘href’] ——-http://www.iana.org/domains/example
soup.a.prettify() —–格式化输出
< a href=”http://www.iana.org/domains/example”>
More information…
<’/’a>
正则解析
导入re模块
for str in soup.find_all(‘img’,{“src”:re.compile(“http:\/\/mm.*.jpg”)}):
print str
3 实际案例
3.1 从妹子图这个网站上抓图片

from   bs4 import  BeautifulSoup
from urllib import urlopen
import  re
import  requests
url='http://www.meizitu.com/'
header = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20100101 Firefox/36.0'} Gecko/20100101 Firefox/36.0'}
response = requests.get(url, headers=header)
html=response.text
soup=BeautifulSoup(html,'lxml')
imgs= soup.find_all('img',{"src":re.compile("http:\/\/mm.*.jpg")}) #正则匹配链接地址
for i,img in enumerate(imgs):
    try:
        html=urlopen(img['src'])
        data=html.read()
        fileName="{}/{}.jpg".format('e:/photo/',i+1) #批量命名文件
        print ("loading",fileName )
        with open(fileName,'wb') as f:
            f.write(data)
    except Exception:
        print ("地址错误")

以上主要是beautifulsoup对tag的解析,获取url以后,重点是文件的写入

3.2 从淘宝女郎上面抓mm的信息和图片


import os
import threading
import re
from bs4 import BeautifulSoup
from urllib import urlopen
from selenium import webdriver

browserPath =  'phantomjs-1.9.2-windows/phantomjs.exe'
homePage = 'https://mm.taobao.com/search_tstar_model.htm?'
outputDir = 'e:/photo/'
parser = 'lxml'
def main():
    driver = webdriver.PhantomJS(executable_path=browserPath)  #浏览器的地址
    driver.get(homePage)  #访问目标网页地址
    bsObj = BeautifulSoup(driver.page_source, parser)  #解析目标网页的 Html 源码
    print("[*]OK GET Page")
    driver=webdriver.Firefox()
    print 'a'
    driver.implicitly_wait(10)
    print 'b'
    girlsList = driver.find_element_by_id('J_GirlsList').click()
    #获得主页上所有妹子的姓名、所在城市、身高、体重等信息 .text.split('\n')
    imagesUrl = re.findall('\/\/gtd\.alicdn\.com\/sns_logo.*\.jpg',
                           driver.page_source)  #获取所有妹子的封面图片
    girlsUrl = bsObj.find_all(
        "a",
        {"href": re.compile("\/\/.*\.htm\?(userId=)\d*")})  #解析出妹子的个人主页地址等信息



    girlsNL = girlsList[::3]
    # 所有妹子的身高体重
    girlsHW = girlsList[1::3]
    # 所有妹子的个人主页地址
    girlsHURL = [('http:' + i['href']) for i in girlsUrl]
    # 所有妹子的封面图片地址
    girlsPhotoURL = [('https:' + i) for i in imagesUrl]

    girlsInfo = zip(girlsNL, girlsHW, girlsHURL, girlsPhotoURL)

    # 姓名地址      girlNL,  身高体重 girlHW
    # 个人主页地址  girlHRUL, 封面图片 URL
    for girlNL, girlHW, girlHURL, girlCover in girlsInfo:
        print("[*]Girl :", girlNL, girlHW)
        # 为妹子建立文件夹
        mkdir(outputDir + girlNL)
        print("    [*]saving...")
        # 获取妹子封面图片
        data = urlopen(girlCover).read()
        with open(outputDir + girlNL + '/cover.jpg', 'wb') as f:
            f.write(data)
        print("    [+]Loading Cover... ")
        # 获取妹子个人主页中的图片
        getImgs(girlHURL, outputDir + girlNL)
    driver.close()
def mkdir(path):
    # 判断路径是否存在
    isExists = os.path.exists(path)
    # 判断结果
    if not isExists:
        # 如果不存在则创建目录
        print("    [*]新建了文件夹", path)
        # 创建目录操作函数
        os.makedirs(path)
    else:
        # 如果目录存在则不创建,并提示目录已存在
        print('    [+]文件夹', path, '已创建')


def getImgs(url, path):
    driver = webdriver.PhantomJS(executable_path=browserPath)
    driver.get(url)
    print("    [*]Opening...")
    bsObj = BeautifulSoup(driver.page_source, parser)
    #获得模特个人页面上的艺术照地址
    imgs = bsObj.find_all("img", {"src": re.compile(".*\.jpg")})
    for i, img in enumerate(imgs[1:]):  #不包含与封面图片一样的头像
        try:
            html = urlopen('https:' + img['src'])
            data = html.read()
            fileName = "{}/{}.jpg".format(path, i + 1)
            print("    [+]Loading...", fileName)
            with open(fileName, 'wb') as f:
                f.write(data)
        except Exception:
            print("    [!]Address Error!")
    driver.close()


if __name__ == '__main__':
    if not os.path.exists(outputDir):
        os.makedirs(outputDir)
    main()

重点是selenium 的webdriver,是一个强大的网络数据采集工具,最初是为网站自动化测试而开发的。近几年,他还被广泛用于获取精确的网站快照,因为他们可以直接运行在浏览器上。Selenium 可以让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作上是否发生。但是selenium需要指定浏览器,还要安装对应的核心驱动,配置起来比较麻烦。博主尝试了很多次,还是一直can`t find element ,主要问题就是webdriver的配置有问题。
driver.implicitly_wait(10) 以及在firfox安装文件下面安装geckodriver.exe 是常用的解决方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值